Пример #1
0
        /// <summary>
        /// 指定した<paramref name="parser"/>で解析したCSVを検証して全てのエラーを返します。
        /// </summary>
        /// <param name="parser">CSVを解析する<see cref="CsvTextFieldParser"/>。</param>
        /// <returns>検証で発生したエラー。</returns>
        /// <exception cref="CsvParseException">CSVの解析に失敗しました。</exception>
        public List <CsvErrorItem> GetErrors(CsvTextFieldParser parser)
        {
            var result     = new List <CsvErrorItem>();
            var lineNumber = 0L;

            while (!parser.EndOfData)
            {
                lineNumber++;

                try
                {
                    var csvItems = new CsvItems(parser.ReadFields(), lineNumber);

                    if (this.HasHeader && lineNumber == 1)
                    {
                        continue;
                    }

                    result.AddRange(this.csvParser.GetErrors(csvItems));
                }
                catch (CsvMalformedLineException ex)
                {
                    throw new CsvParseException(ex.Message, ex.LineNumber, parser.ErrorLine, ex);
                }
            }

            return(result);
        }
Пример #2
0
        /// <summary>
        /// 指定した<paramref name="reader"/>に格納されているCSVを逆シリアル化します。
        /// </summary>
        /// <param name="reader">CSVを読み取る<see cref="TextReader"/>。</param>
        /// <returns>オブジェクト。</returns>
        /// <exception cref="CsvParseException">CSVの解析に失敗しました。</exception>
        /// <exception cref="CsvValidationException">CSVの検証に失敗しました。</exception>
        public List <T> Deserialize(TextReader reader)
        {
            var result      = new List <T>();
            var lineNumber  = 0L;
            var fieldParser = CreateCsvTextFieldParser(reader);

            while (!fieldParser.EndOfData)
            {
                lineNumber++;

                try
                {
                    var csvItems = new CsvItems(fieldParser.ReadFields(), lineNumber);

                    if (this.HasHeader && lineNumber == 1)
                    {
                        continue;
                    }

                    result.Add(this.csvParser.CreateObject(csvItems));
                }
                catch (CsvMalformedLineException ex)
                {
                    throw new CsvParseException(ex.Message, ex.LineNumber, fieldParser.ErrorLine, ex);
                }
            }

            return(result);
        }
Пример #3
0
        /// <summary>
        /// エラーが存在する場合はエラーを返します。
        /// </summary>
        /// <param name="items"><see cref="CsvItems"/>。</param>
        /// <returns><see cref="CsvErrorItem"/>のコレクション。</returns>
        public IEnumerable <CsvErrorItem> GetErrors(CsvItems items)
        {
            foreach (var column in this.columns)
            {
                if (column.IsNull)
                {
                    continue;
                }

                if (!column.TryCreateCsvItemContext(items, out ICsvItemContext context))
                {
                    yield return(new CsvErrorItem(CsvConfig.Current.ValidationMessage.GetItemNotExistError(context.LineNumber, context.Name), context));

                    continue;
                }

                if (!column.Validate(context, out string validateMessage))
                {
                    yield return(new CsvErrorItem(validateMessage, context));

                    continue;
                }

                if (!column.TryConvertToObjectItem(context, out _, out string convertMessage))
                {
                    yield return(new CsvErrorItem(convertMessage, context));

                    continue;
                }
            }
        }
Пример #4
0
        /// <summary>
        /// <see cref="CreateCsvItemContext"/>を作成します。作成できない場合は例外をスローします。
        /// </summary>
        /// <param name="column"><see cref="CsvColumn"/>。</param>
        /// <param name="items"><see cref="CsvItems"/>。</param>
        /// <returns></returns>
        private static ICsvItemContext CreateCsvItemContext(CsvColumn column, CsvItems items)
        {
            if (!column.TryCreateCsvItemContext(items, out ICsvItemContext context))
            {
                throw new CsvValidationException(CsvConfig.Current.ValidationMessage.GetItemNotExistError(context.LineNumber, context.Name), context);
            }

            return(context);
        }
Пример #5
0
        /// <summary>
        /// <see cref="ICsvItemContext"/>の作成を試みます。
        /// </summary>
        /// <param name="items"><see cref="CsvItems"/>。</param>
        /// <param name="context"><see cref="ICsvItemContext"/>。</param>
        /// <returns>作成できた場合にtrue。</returns>
        public bool TryCreateCsvItemContext(CsvItems items, out ICsvItemContext context)
        {
            if (!items.TryGetItem(this.attribute.Index, out string csvItem))
            {
                context = new CsvItemContext(this.Name, items.LineNumber, string.Empty);
                return(false);
            }

            context = new CsvItemContext(this.Name, items.LineNumber, csvItem);
            return(true);
        }
Пример #6
0
        /// <summary>
        /// オブジェクトを作成します。
        /// </summary>
        /// <param name="items"><see cref="CsvItems"/>。</param>
        /// <returns>オブジェクト。</returns>
        public T CreateObject(CsvItems items)
        {
            var result = new T();

            foreach (var column in this.columns)
            {
                if (column.IsNull)
                {
                    continue;
                }

                var context = CreateCsvItemContext(column, items);

                Validate(column, context);

                column.SetValue(result, ConvertToObjectItem(column, context));
            }

            return(result);
        }