在我们公司,我们会收到来自为我们提供CSV文件的供应商的分发供稿。 但是,它们无法转义其文本字段中的引号字符,这会导致忽略多行;使用文本字段解析器。
坏线的一个例子:
" CABLES TO GO"," 87029"," 5.0200"," 47"," 757120870296" ," 87029"," WP SGL ALUM 1 1/2" GROMMET"
相应的代码段为:
private static IEnumerable<string> ParseHelper(String line, int lineRead, Encoding enc)
{
MemoryStream mem = new MemoryStream(enc.GetBytes(line));
TextFieldParser readerTemp = new TextFieldParser(mem, enc) {CommentTokens = new[] {"#"}};
readerTemp.SetDelimiters(new[] { "," });
readerTemp.HasFieldsEnclosedInQuotes = true;
readerTemp.TextFieldType = FieldType.Delimited;
readerTemp.TrimWhiteSpace = true;
try
{
var items = readerTemp.ReadFields();
return items;
}
catch (MalformedLineException ex)
{
throw new MalformedLineException(String.Format(
"Line {0} is not valid and will be skipped: {1}\r\n{2}",
lineRead, readerTemp.ErrorLine, ex));
}
}
此外,此供应商无法更改源文件以转义这些引号。 这些行的最佳解决方法是什么?
答案 0 :(得分:1)
没有解决方法。
CSV规范允许使用未转义的引号来封装字段值。如果他们在字段值中处理带有未转义引号的文件,则表示您遇到问题。
这些不是CSV文件(它们违反规范,因此不是您认为的那样)。
如果您坚持尝试将它们解析为CSV,则可以首先转义未由记录终止符或字段分隔符进行的所有未转义的引号。
这种方法只会到目前为止。有时损坏的数据不会被破坏。