如何在TextFieldParser引发错误时捕获有问题的行?
问题描述:
我正在使用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
来捕获这些数据?
答
我其实并没有打算回答我自己的问题,但事实证明这很容易:对象上还有其他方法可以做到这一点:ErrorLine
和ErrorLineNumber
。
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
}
}
}
我很困惑与你陈述“但我不知道我怎样才能得到它:阅读字段似乎就移动到下一行,即使它的错误”,认为一旦错误,它没有继续while循环并试图弄清楚这是什么错误......否则它是一个简单的 – Rex