C# 文本字段分析器错误

本文关键字:错误 分析器 字段 文本 | 更新日期: 2023-09-27 18:35:07

>我有以下代码段来读取csv文件。我在阅读非标准行时遇到问题。例如,像这样的一行

105,"XXX Bank Azerbaijan" CJSC,1078      ,AZ,Baku,"xxx street",Nasimi district

进入捕获字段,因为第二个字段"XXX银行阿塞拜疆"CJSC的引号不在逗号旁边。但是,当我在Excel中打开此文件时,它没有任何问题,并且可以正确分隔字段,如下所示:

105|XXX Bank Azerbaijan CJSC|1078|AZ|Baku|xxx street|Nasimi district

我使用 | 作为列分隔符的地方。有没有办法使用 TextFieldParser 产生相同的效果,否则我将需要使用不同的 csv 阅读器。

  using (TextFieldParser parser = new TextFieldParser(fileName, Encoding.GetEncoding("windows-1252")))
  {
            parser.TextFieldType = FieldType.Delimited;
            parser.SetDelimiters(",");
            parser.TrimWhiteSpace = true;
            parser.HasFieldsEnclosedInQuotes = true;
            parser.ReadLine(); // Reads dummy header
            while (!parser.EndOfData)
            {
                try
                {
                    string[] fieldRow = parser.ReadFields();
                    T fieldsClass = new T();
                    fieldsClass.Initialize(fieldRow);
                    data.Add(fieldsClass);
                    rowCount++;
                }
                catch
                {
                    Console.WriteLine("Skipping line" + parser.ErrorLine);
                }
            }
}

C# 文本字段分析器错误

首先,如果这实际上是格式不正确的数据,那么你最好的选择是按照Hans Passant的建议去做:

最好的办法是将文件发回并让程序员 修复他代码中的错误。您唯一能做的就是修复 在让解析器看到它之前,自己串起来。

但是,如果这是按照当时商定的任何规范正确格式化的,那么您可以尝试设置解析器。HasFieldsEnclosedInQuotes = false; 这将使它解析,但它不会像示例 excel 导入中那样去除双引号。它还会导致textfieldparser将"foo,bar"解析为"foo"和"bar"而不是"foo,bar"(一个字段)。这可以通过指定数据源使用的不同分隔符来解决,该分隔符不会在字段值中间找到。

与将规范更改为仅允许在字段分隔符前后使用双引号相比,更改规范以使用 | 而不是 作为字段分隔符并处理每个字段中的双引号可能更容易。