2017-10-10 49 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