1

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

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

进入捕获字段,因为第二个字段“XXX Bank Azerbaijan”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);
                }

            }
}
4

1 回答 1

0

首先,如果这实际上是格式不正确的数据,那么您最好的选择是按照 Hans Passant 的建议进行操作,并且:

最好的办法是将文件发回并让程序员修复其代码中的错误。您唯一可以做的另一件事是在让解析器看到之前自己修复字符串。

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

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

于 2014-12-22T15:04:19.637 回答