2017-10-20 74 views
1

我希望能夠遍歷CSV文件中的所有記錄,並將所有良好記錄添加到一個集合中,並分別處理所有「壞」記錄。我似乎無法做到這一點,我想我必須錯過一些東西。在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}>"); 
}; 

然而,儘管回調被稱爲不良記錄在我的「好人榜」

最終還是有索姆通過這種方式,我可以向讀者查詢在添加到我的列表之前該記錄是否良好?

在這個例子中我的記錄定義是 -

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

而且數據(第一行不好,第二排好) -

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

有趣的是處理與MissingFieldException缺少場似乎正好發揮作用如我所願 - 拋出異常,但後續行仍然可以正常讀取。

+0

那麼,文件格式並沒有指定這樣的事情作爲「壞行」。你遇到的是一個損壞的文件,並進一步閱讀,猜測格式規範失敗後剩下的可能是什麼都沒有意義。這不是有效的CSV。 – nvoigt

+0

我不明白你最後的評論,如果'MissingFieldException'是你想要什麼,你需要什麼,爲什麼它不工作? –

+0

爲什麼不把指令if(!reader.Read())打破;在while塊中嘗試{}之前? –

回答

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; } 
} 
相關問題