gpt4 book ai didi

c# - 当 TextFieldParser 抛出错误时,如何从它捕获有问题的行?

转载 作者:太空宇宙 更新时间:2023-11-03 15:00:02 39 4
gpt4 key购买 nike

我正在使用 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 来捕获这些数据?

最佳答案

我其实并不打算回答我自己的问题,但事实证明这很简单:对象上还有其他方法可以做到这一点: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
}
}
}

关于c# - 当 TextFieldParser 抛出错误时,如何从它捕获有问题的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46669005/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com