我一直在尝试传递一个包含三个字段的csv文件。前两个字段很简单并且很容易提取,问题在于第三个字段本质上是字符串,因此可以包含特殊字符,包括','self,用于分隔字段。我尝试在两个'''(双引号)之间包含字符串字段。但我的要求是,对于简单的字符串(没有特殊字符),可以不使用双引号存在。我还需要处理字符串中的下一行。下面是一个csv文件的样本。
123,是的,这是一份备忘录
234,false,“这也是一份备忘录”
345,真实,
456,是的,在我之上是一份空白的备忘录 567,假,“这有一个,在其中“
678,是的,这有一个,在它< ---这个记录应该被拒绝
789,假 “”
890,是的,在我之上也是一个有效的空白备忘录
我还找到了一个在http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx
上测试正则表达式格式字符串的好工具直到现在我使用了以下格式字符串 ^( “”(?:[^ “”] | “” “”)的 “” | [^,] ),( “”(?:[^ “”] | “” “” ) “” | [^,] )$
此格式字符串的问题在于它不处理多行,并且不会拒绝具有起始双引号但缺少结束双引号的字符串。
提前致谢。
感谢帮助人员,但我需要用CSV解析自定义数据,并且必须创建自己的自定义解析器。我正在分别解析每个字段并使用小块中的正则表达式字符串。
答案 0 :(得分:4)
没有必要再发明这个轮子。我建议使用现有的CSV解析器,但有很多不错的选择。
我在CSVReader取得了巨大的成功,它非常快速且易于使用。基本用法:
using (CsvReader csv = new CsvReader(new StreamReader("data.csv"), true))
{
int fieldCount = csv.FieldCount;
string[] headers = csv.GetFieldHeaders();
while (csv.ReadNextRecord())
{
for (int i = 0; i < fieldCount; i++)
Console.Write(string.Format("{0} = {1};", headers[i], csv[i]));
Console.WriteLine();
}
}