我必须加载以下CSV文件
head1, head2, head3, head4; head5
34 23; 2; "abc";"abc \"sdjh";8
34 23; 2; "abc";"abc
sdj\;h
jshd";8
34 23; 2; "abc";"abc";8
该函数必须处理转义字符,例如\"
\;
\n
和\r
以及字符串中的换行符。
有没有好的图书馆来解决这个问题?
答案 0 :(得分:3)
我使用CSV阅读器为.Net做了很好的结果:http://www.codeproject.com/KB/database/CsvReader.aspx。
答案 1 :(得分:1)
这不是有效的CSV文件...
标题行将被解释为
"head1"," head2"," head3"," head4; head5"
每隔一行只有一列。
我认为任何图书馆都无法开箱即用。看起来标题行有多个分隔符,所有其他行也可能有多个分隔符。如果您还提供了实际列的内容,则可以更轻松地提供帮助。
您可以试试CsvHelper(我维护的图书馆)。它非常灵活。您可以更改标题和行的配置,并使它们不同。您可以设置分隔符和引用字段的内容。它还处理\ r,\ n和\ r \ n的行结尾,即使每一行使用不同的行结尾。
答案 2 :(得分:0)
我无法通过我的所有测试来解析CSV分析,所以我最终写了一些简单的东西。 AnotherCsvParser
它可以完成我需要的一切......但也应该很容易分叉并扩展到您的需求。
假设:
public class ABCD
{
public string A;
public string B;
public string C;
public string D;
}
它假设列按照字段定义的顺序..(但很容易扩展以读取属性或其他内容)
这有效:
var output = NigelThorne.CSVParser.ReadCSVAs<ABCD>(
"a,\"b\",c,d\n1,2,3,4\n\"something, with a comma\",\"something \\\"in\\\" quotes\",\" a \\\\ slash \",\n,,\"\n\",");
这样:
Assert.AreEqual(4, output.ToArray().Length);
var row1 = output.ToArray()[0];
Assert.AreEqual("a", row1.A);
Assert.AreEqual("b", row1.B);
Assert.AreEqual("c", row1.C);
Assert.AreEqual("d", row1.D);
注意:对于大量数据来说,它可能不是很快..再次对我来说不是问题。