我正在使用 TextFieldParser
类来读取 CSV 文件。它有两种获取数据行的方法:ReadFields()
和 ReadLine()
。正如您想象的那样,前者将数据视为柱状数据,由预设分隔符分隔,而后者读取原始数据。我使用的是前者,代码如下:
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 block 中做的是记录该行的实际文本以及行号,以便更容易找出问题所在。但我不知道如何获得它:ReadFields
似乎移动到下一行,即使它出错,如果我在 catch block 中调用 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
}
}
}
关于c# - 当 TextFieldParser 抛出错误时,如何从它捕获有问题的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46669005/