/// <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); }
/// <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); }
/// <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; } } }
/// <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); }
/// <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); }
/// <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); }