C#textFieldParser错误

时间:2014-12-22 11:29:37

标签: c# excel csv textfieldparser

我有以下代码段来读取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);
                }

            }
}

1 个答案:

答案 0 :(得分:0)

首先,如果这实际上是错误格式化的数据,那么你最好的选择就是做汉斯·帕斯特所建议的:

  

最好的办法是将文件发回并让程序员进入   修复他的代码中的错误。你唯一能做的就是解决这个问题   在你让解析器看到之前给自己打字。

但是,如果按照之前的协议规定格式正确,那么你可以尝试设置parser.HasFieldsEnclosedInQuotes = false;这将使其解析但是它不会像你的示例excel导入中那样删除双引号。它还会导致textfieldparser解析" foo,bar"作为'" foo'并且' bar"'而不是" foo,bar" (一个领域)。这可以通过指定数据源使用的不同分隔符来解决,这些分隔符不会在字段值的中间找到。

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