在数据中使用逗号解析CSV

可能重复:
在CSV文件中处理逗号

我写了一个CSV解析器,它工作正常,直到我达到此记录: B002VECGTG,B002VECGTG,HAS_17131_spaceshooter,"4,426",0.04%,"4,832",0.03%,0%,1,0.02%,$20.47 ,1逃脱, “4,426”和“4,426”制动我的解析器。

这就是我用来解析文本行的内容:

  char[] comma = { ',' }; string[] words = line.Split(comma); 

如何防止我的程序破坏?

你不能只用逗号分开。 要为该情况实现正确的解析器,您需要自己遍历字符串,跟踪您是否在引号内。 如果你在一个带引号的字符串中,你应该继续,直到你找到另一个引用。

 IEnumerable LineSplitter(string line) { int fieldStart = 0; for(int i = 0; i < line.Length; i++) { if(line[i] == ',') { yield return line.SubString(fieldStart, i - fieldStart); fieldStart = i + 1; } if(line[i] == '"') for(i++; line[i] != '"'; i++) {} } } 

我建议使用CSV解析器而不是尝试自己解析。

正如您已经发现的那样,正确解析CSV有一些细微差别。

有许多第三方(其中一些是免费的),甚至一个内置到Visual Basic命名空间TextFieldParser命名空间中的TextFieldParser

可以使用正则表达式:

 List> rows = new List>(); MatchCollection matches = Regex.Matches(input, @"^(?:(?:\s*""(?[^""]*)""\s*|(?[^,]*)),)*?(?:\s*""(?>value>[^""]*)""\s*|(?[^,]*))$", RegexOptions.Multiline); foreach(Match row in matches) { List values = new List(); foreach(Capture value in row.Groups["value"].Captures) { values.Add(value.Value); } rows.Add(values); } 

我不建议它是最好的解决方案,但对于小文件(几行),它可能不是太糟糕。