web-dev-qa-db-ja.com

CsvHelperで変換エラーをキャッチし、どのフィールドとどの行で発生したかを知る方法は?

私はクラスCsvReaderをうまく使用していて満足していますが、私が使用するファイルは、知らないうちに列の形式を変更するグループによって作成されています。

つまり、すべてが正常に機能していると、翌朝の問題が発生し、csv.GetRecord<MyType>()のtry catchブロックがエラーをキャッチしてログに記録しますが、Exceptionインスタンスから重要な情報を収集できません。 「変換は実行できません」とだけ書かれています。 InnerExceptionには何もありません。あまり役に立たない。 150列のうちどれが問題の原因であるのかさえわかりません。

どの行のどの列が問題を引き起こしているのかを特定する方法を理解するのを手伝ってくれませんか?

ありがとう

31
t316

まず、CsvTypeConverterExceptionをキャッチする必要があるようです。

 while (csv.Read())
    {
       try
       {    
          var record = csv.GetRecord<MyType>();    
       }
       catch (CsvTypeConverterException ex)
       {
         //ex.Data.Values has more info...
       }
    }

問題の原因を調査する方法はわかりましたが、そのフィールドがスキップされ、その行の残りのフィールドが変換されて、行全体が破棄されないようにするにはどうすればよいですか?

ありがとう

7
t316

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

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

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.
};
45
Josh Close