我正在尝试使用导入 CSV 文件文本字段解析器。一个特定的 CSV 文件由于其非标准格式而给我带来了问题。相关 CSV 的字段用双引号括起来。当特定字段中有一组附加的未转义双引号时,就会出现此问题。
这是一个过于简单的测试用例,突出了这个问题。我正在处理的实际 CSV 文件的格式并不相同,并且有数十个字段,其中任何一个都可能包含这些可能棘手的格式问题。
TextReader reader = new StringReader("\"Row\",\"Test String\"\n" +
"\"1\",\"This is a test string. It is parsed correctly.\"\n" +
"\"2\",\"This is a test string with a comma, which is parsed correctly\"\n" +
"\"3\",\"This is a test string with double \"\"double quotes\"\". It is parsed correctly\"\n" +
"\"4\",\"This is a test string with 'single quotes'. It is parsed correctly\"\n" +
"5,This is a test string with fields that aren't enclosed in double quotes. It is parsed correctly.\n" +
"\"6\",\"This is a test string with single \"double quotes\". It can't be parsed.\"");
using (TextFieldParser parser = new TextFieldParser(reader))
{
parser.Delimiters = new[] { "," };
while (!parser.EndOfData)
{
string[] fields= parser.ReadFields();
Console.WriteLine("This line was parsed as:\n{0},{1}",
fields[0], fields[1]);
}
}
无论如何,是否可以使用 TextFieldParser 正确解析具有此类格式的 CSV?
我同意 Hans Passant 的建议,即解析格式错误的数据不是您的责任。然而,根据稳健性原则,遇到这种情况的人可能会尝试处理特定类型的格式错误的数据。我在下面编写的代码适用于问题中指定的数据集。基本上,它会检测格式错误的行上的解析器错误,根据第一个字符确定是否用双引号引起来,然后手动拆分/剥离所有引起的双引号。
using (TextFieldParser parser = new TextFieldParser(reader))
{
parser.Delimiters = new[] { "," };
while (!parser.EndOfData)
{
string[] fields = null;
try
{
fields = parser.ReadFields();
}
catch (MalformedLineException ex)
{
if (parser.ErrorLine.StartsWith("\""))
{
var line = parser.ErrorLine.Substring(1, parser.ErrorLine.Length - 2);
fields = line.Split(new string[] { "\",\"" }, StringSplitOptions.None);
}
else
{
throw;
}
}
Console.WriteLine("This line was parsed as:\n{0},{1}", fields[0], fields[1]);
}
}
我确信可以编造一个失败的病态示例(例如,字段值中与双引号相邻的逗号),但任何此类示例在最严格的意义上可能都是不可解析的,而问题中给出的问题行是尽管格式错误但仍可辨认。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)