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);
}
}
}
首先,如果这实际上是格式不正确的数据,那么你最好的选择是按照Hans Passant的建议去做:
最好的办法是将文件发回并让程序员 修复他代码中的错误。您唯一能做的就是修复 在让解析器看到它之前,自己串起来。
但是,如果这是按照当时商定的任何规范正确格式化的,那么您可以尝试设置解析器。HasFieldsEnclosedInQuotes = false; 这将使它解析,但它不会像示例 excel 导入中那样去除双引号。它还会导致textfieldparser将"foo,bar"解析为"foo"和"bar"而不是"foo,bar"(一个字段)。这可以通过指定数据源使用的不同分隔符来解决,该分隔符不会在字段值中间找到。
与将规范更改为仅允许在字段分隔符前后使用双引号相比,更改规范以使用 | 而不是 作为字段分隔符并处理每个字段中的双引号可能更容易。