2017-10-20 3 views
1

CSVファイルのすべてのレコードを繰り返し処理し、すべての正常なレコードを1つのコレクションに追加し、すべての「不良」レコードを個別に処理したいと考えています。私はこれを行うことができないようで、私は何かが欠けているに違いないと思う。CsvHelperで不正なCSVレコードを処理する

私はBadDataExceptionをキャッチしようとすると、その後のは、私が運ぶと、ファイルの残りの部分を読むことができないという意味失敗します読み込み -

while (true) 
{ 
    try 
    { 
     if (!reader.Read()) 
      break; 

     var record = reader.GetRecord<Record>(); 
     goodList.Add(record); 
    } 
    catch (BadDataException ex) 
    { 
     // Exception is caught but I won't be able to read further rows in file 
     // (all further reader.Read() result in same exception thrown) 
     Console.WriteLine(ex.Message); 
    } 
} 

議論し、他のオプションは、それを処理するためにBadDataFoundコールバックアクションを設定しています -

reader.Configuration.BadDataFound = x => 
{ 
    Console.WriteLine($"Bad data: <{x.RawRecord}>"); 
}; 

コールバックが呼び出されるが、悪い記録はまだ私の「良いリスト」で終わるしかし

がSOMがあります私のリストに追加する前にレコードが良いかどうかを読者に問い合わせることができますか?

この例では、私のレコード定義がある -

class Record 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int Age { get; set; } 
} 

とデータ(最初の行の不良、第二列に良い) - 興味深いことにMissingFieldExceptionで不足している分野を取り扱う

"Jo"hn","Doe",43 
"Jane","Doe",21 

は正確に機能しているようです私が望むように - 例外はスローされますが、後続の行はまだokと読み込まれます。

+0

ファイル形式では、「不良行」などは指定されていません。あなたが遭遇したのは、破損したファイルであり、それをさらに読んで、フォーマットの仕様が失敗した後の残りの部分がどれほど意味がないかを推測します。有効なCSVではありません。 – nvoigt

+0

'MissingFieldException'が必要なもので、何が必要なのか、それがなぜうまくいかないのか、あなたの最後のコメントを理解していませんか? –

+0

if(!reader.Read())が壊れた場合、なぜ命令を実行しないのですか? whileブロックでtry {}の前に? –

答えて

0

ここにはexampleがあります。

void Main() 
{ 
    using (var stream = new MemoryStream()) 
    using (var writer = new StreamWriter(stream)) 
    using (var reader = new StreamReader(stream)) 
    using (var csv = new CsvReader(reader)) 
    { 
     writer.WriteLine("FirstName,LastName"); 
     writer.WriteLine("\"Jon\"hn\"\",\"Doe\""); 
     writer.WriteLine("\"Jane\",\"Doe\""); 
     writer.Flush(); 
     stream.Position = 0; 

     var good = new List<Test>(); 
     var bad = new List<string>(); 
     var isRecordBad = false; 
     csv.Configuration.BadDataFound = context => 
     { 
      isRecordBad = true; 
      bad.Add(context.RawRecord); 
     }; 
     while (csv.Read()) 
     { 
      var record = csv.GetRecord<Test>(); 
      if (!isRecordBad) 
      { 
       good.Add(record); 
      } 

      isRecordBad = false; 
     } 

     good.Dump(); 
     bad.Dump(); 
    } 
} 

public class Test 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 
関連する問題