34

私はクラスをCsvReader正常に使用して満足していますが、私が使用するファイルは、私に知らせずに列のフォーマットを変更するグループによって作成されています。

したがって、ある瞬間、すべてが機能し、翌朝、物事が中断し、try catch ブロックcsv.GetRecord<MyType>()がエラーをキャッチしてエラーをログに記録しますが、Exception インスタンスから貴重な情報を収集することはできません。「変換を実行できません」とだけ表示されます。にInnerExceptionは何もありません。あまり役に立ちません。150 個の列のどれが問題を引き起こしているのかさえわかりません。

どの行のどの列が問題を引き起こしているかを特定する方法を教えてください。

ありがとう

4

3 に答える 3

50

現在、フィールド/プロパティ レベルでエラーを無視する方法はありません。現在のオプションは次のとおりです。

例外データを見てください。

catch( Exception ex )
{
    // This contains useful information about the error.
    ex.Data["CsvHelper"];
}

読み取り例外を無視します。ただし、これはフィールドではなく行レベルです。ファイル全体を引き続き読み取ることができ、機能しない行は無視されます。例外が発生したときにコールバックを取得できます。

csv.Configuration.IgnoreReadingExceptions = true;
csv.Configuration.ReadingExceptionCallback = ( ex, row ) =>
{
    // Do something with the exception and row data.
    // You can look at the exception data here too.
};
于 2014-04-10T19:08:44.637 に答える
0

CsvHelperにはCsvReaderに public 'Context' フィールドがあり、問題を表示するために必要なものがすべてあります。

try
{
    var records = csvReader.GetRecords<MyType>().ToList();
}
catch (CsvHelperException e)
{
    Console.WriteLine($"{e.Message} " + (e.InnerException == null ? string.Empty : e.InnerException.Message));
    Console.WriteLine($"Row: {csvReader.Context.Row}; RawLine: {csvReader.Context.RawRecord}");
    if (csvReader.Context.CurrentIndex >= 0 &&
        csvReader.Context.CurrentIndex < csvReader.Context.HeaderRecord.Length)
    {
        Console.WriteLine($"Column: {csvReader.Context.CurrentIndex}; ColumnName: {csvReader.Context.HeaderRecord[csvReader.Context.CurrentIndex]}");
    }
    throw;
}
于 2020-12-14T13:38:50.010 に答える