2017-10-10 36 views
2

我正在使用TextFieldParser類讀取CSV文件。它有兩種攝取數據行的方法:ReadFields()ReadLine()。正如您可以想象的那樣,前者將數據視爲列狀,由預設分隔符分隔,而後者讀取原始數據。我使用的是前者,像這樣的代碼:如何在TextFieldParser引發錯誤時捕獲有問題的行?

using (TextFieldParser parser = new TextFieldParser(newestFile.FullName)) 
{ 
    parser.Delimiters = "," 
    parser.HasFieldsEnclosedInQuotes = true; 

    while (!parser.EndOfData) 
    { 
     try 
     { 
      List<string> result = parser.ReadFields().ToList(); 
      // do something 
     } 
     catch(MalformedLineException ex) 
     { 
      // log error to record line where it happened 
     } 
    } 
} 

MalformedLineException美中不足的是有保證的事情,如果它符合不符合標準的解析一個行不倒下 - 這可能在一個字段中有額外的引號,例如 - 它會記錄下來,然後轉到下一行,而不會使整個事件停止。

但是,我真的想在catch塊中做的事情是記錄行的實際文本以及行號,以便更容易地找出問題所在。但我不知道如何得到它:ReadFields即使出現錯誤也會轉移到下一行,如果我在catch塊中調用ReadLine,它也會移到下一行,這意味着行會被跳過。它看起來不是拋出異常的一部分,或者當ReadFields失敗時通過對象可用。

有沒有辦法使用TextFieldParser來捕獲這些數據?

回答

0

我其實並沒有打算回答我自己的問題,但事實證明這很容易:對象上還有其他方法可以做到這一點:ErrorLineErrorLineNumber

using (TextFieldParser parser = new TextFieldParser(newestFile.FullName)) 
{ 
    parser.Delimiters = "," 
    parser.HasFieldsEnclosedInQuotes = true; 

    while (!parser.EndOfData) 
    { 
     try 
     { 
      List<string> result = parser.ReadFields().ToList(); 
      // do something 
     } 
     catch(MalformedLineException ex) 
     { 
      int errorLine = parser.ErrorLineNumber; 
      string originalData = parser.ErrorLine; 
      // log them 
     } 
    } 
} 
+0

我很困惑與你陳述「但我不知道我怎樣才能得到它:閱讀字段似乎就移動到下一行,即使它的錯誤」,認爲一旦錯誤,它沒有繼續while循環並試圖弄清楚這是什麼錯誤......否則它是一個簡單的 – Rex