用于解析CSV的正则表达式

时间:2012-07-06 14:41:10

标签: c# regex expression

我正在尝试用C#解析CSV文件。用逗号分隔(,)。我得到了它的工作:

[\t,](?=(?:[^\"]|\"[^\"]*\")*$)

拆分此字符串:

2012-01-06,"Some text with, comma",,"300,00","143,52"

给我:

2012-01-06
"Some text with, comma"

"300,00"
"143,52"

但我无法弄清楚如何从输出中丢失“”,所以我得到了这个:

2012-01-06
Some text with, comma

300,00
143,52

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

如果您尝试解析CSV并使用.NET,请不要使用正则表达式。使用为此目的创建的组件。请参阅问题CSV File Imports in .Net

我知道CSV规范看起来很简单,但请相信我,如果你继续沿着这条路走下去,你会感到心痛和破坏。

答案 1 :(得分:1)

为什么要使用正则表达式?确保文件格式正确吗?

您可以使用String.Replace()

String s = "Some text with, comma";
s = s.Replace("\"", "");

// After matched
String line = 2012-01-06,"Some text with, comma",,"300,00","143,52";
String []fields = line.Split(',');
for (int i = 0; i < fields.Length; i++)
{
   // Call a function to remove quotes
   fields[i] = removeQuotes(fields[i]);
}

String removeQuotes(String s)
{
   return s.Replace("\"", "");
}

答案 2 :(得分:1)

所以,这样的事情。同样,我不会为此目的使用RegEx,而是YMMV。

var sp = Regex.Split(a, "[\t,](?=(?:[^\"]|\"[^\"]*\")*$)")
     .Select(s => Regex.Replace(s.Replace("\"\"","\""),"^\"|\"$","")).ToArray();

所以,这里的想法是,首先,你想用一个双引号替换双引号。然后该字符串被送入第二个正则表达式,它只是删除字符串开头和结尾的双引号。

第一次替换的原因是因为这样的字符串:

var a = "1999,Chevy,\"Venture \"\"Extended Edition, Very Large\"\" Dude\",\"\",\"5000.00\"";

所以,这会给你一个这样的字符串:“”扩展版“”,双引号需要改为单引号。