拆分CSV并在元素中排除逗号

我有一个CSV字符串,我想把它分成一个数组。 但是,CSV是字符串和数字的混合,其中字符串用引号括起来,可能包含逗号。

例如,我可能有如下CSV:

1,"Hello",2,"World",3,"Hello, World" 

我希望它能将字符串拆分为:

 1 "Hello" 2 "World" 3 "Hello, World" 

如果我使用String.Split(','); 我明白了:

 1 "Hello" 2 "World" 3 "Hello World" 

有这么简单的方法吗? 已经编写的库或者我必须按字符解析字符串吗?

代码项目中的“快速CSV阅读器”文章。 我多次愉快地使用它。

String.Split()对此很苛刻。 它不仅有令人讨厌的角落情况,它不像你刚发现的那样(还有其他你还没见过的),但性能也不太理想。 其他人发布的FastCSVReader会工作,框架中内置了一个不错的csv解析器(Microsoft.VisualBasic.TextFieldParser),我有一个简单的解析器,行为正确地发布到这个问题 。

我建议使用以下解决方案之一,只是测试其中一些(因此延迟): –

  1. 正则表达式匹配逗号在封闭的双重aprostophe中找不到
  2. 快速CSV阅读器 – 仅适用于读取CSV
  3. FileHelpers Library 2.0 – 用于读/写CSV

希望这可以帮助。

它不是最优雅的解决方案,但如果您想快速复制和粘贴代码(避免导入DLL或其他代码库),这是最快的:

  private string[] splitQuoted(string line, char delimeter) { string[] array; List list = new List(); do { if (line.StartsWith("\"")) { line = line.Substring(1); int idx = line.IndexOf("\""); while (line.IndexOf("\"", idx) == line.IndexOf("\"\"", idx)) { idx = line.IndexOf("\"\"", idx) + 2; } idx = line.IndexOf("\"", idx); list.Add(line.Substring(0, idx)); line = line.Substring(idx + 2); } else { list.Add(line.Substring(0, Math.Max(line.IndexOf(delimeter), 0))); line = line.Substring(line.IndexOf(delimeter) + 1); } } while (line.IndexOf(delimeter) != -1); list.Add(line); array = new string[list.Count]; list.CopyTo(array); return array; }