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

标签 c# parsing text error-handling

我正在使用 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/

相关文章:

c# - DI/IoC、NHibernate 并帮助它们协同工作

c# - 如何快速替换数组中的字符

java - Joda 时间无效格式到期日期 facebook 访问 token Java

java - 实时解析大型文本文件 (Java)

将填充设置为 0 后,HTML 文本元素的填充在浏览器之间不一致

python - 包含 '#' 时文本操作的惊人输出

c# - 在 WPF 中使用附加属性

java - 无法在 linux 上解析 xhtml 文档

python - 将数据从字典加载到 csv

c# - 在 C# 中异步运行 IronPython 脚本