如何使用C#split()函数正确拆分CSV?

假设我有这个CSV文件:

NAME,ADDRESS,DATE "Eko S. Wibowo", "Tamanan, Banguntapan, Bantul, DIY", "6/27/1979" 

我想将使用双引号括起来的每个令牌存储在一个数组中,是否可以安全地执行此操作而不是使用String split()函数? 目前我在RichTextBox中加载文件,然后使用其Lines []属性,我为每个Lines []元素执行循环并执行以下操作:

 string[] line = s.Split(','); 

s是对RichTextBox.Lines []的引用。 而且你可以清楚地看到,令牌内的逗号很容易搞乱split()函数。 所以,不是以我想要的三个令牌结束,而是以6个令牌结束

任何帮助将不胜感激!

你也可以使用正则表达式:

 string input = "\"Eko S. Wibowo\", \"Tamanan, Banguntapan, Bantul, DIY\", \"6/27/1979\""; string pattern = @"""\s*,\s*"""; // input.Substring(1, input.Length - 2) removes the first and last " from the string string[] tokens = System.Text.RegularExpressions.Regex.Split( input.Substring(1, input.Length - 2), pattern); 

这会给你:

 Eko S. Wibowo Tamanan, Banguntapan, Bantul, DIY 6/27/1979 

我用自己的方法完成了这个。 它只计算"'字符的大小。
根据您的需求改进。

  public List SplitCsvLine(string s) { int i; int a = 0; int count = 0; List str = new List(); for (i = 0; i < s.Length; i++) { switch (s[i]) { case ',': if ((count & 1) == 0) { str.Add(s.Substring(a, i - a)); a = i + 1; } break; case '"': case '\'': count++; break; } } str.Add(s.Substring(a)); return str; } 

这不是你的问题的确切答案,但为什么你不使用已经编写的库来操纵CSV文件,很好的例子是LinqToCsv 。 CSV可以用各种标点符号分隔。 此外,还有一些问题,这些问题已经由图书馆创建者解决。 比如处理名称行,处理不同的日期格式以及将行映射到C#对象。

如果您的CSV行紧密包装,最容易使用前面提到的结束和尾部删除,然后在连接字符串上进行简单拆分

  string[] tokens = input.Substring(1, input.Length - 2).Split("\",\""); 

这只有在所有字段都是双引号的情况下才有效,即使它们没有(官方)需要。 它会比RegEx更快,但在使用时会有一定的条件。

如果您的数据看起来像“名称”,“1”,“12/03/2018”,“Add1,Add2,Add3”,“其他东西”,那将非常有用

你可以用","代替; 然后分裂;

 var values= s.Replace("\",\"",";").Split(';');