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

swd*_*dev 10 c#

假设我有这个CSV文件:

NAME,ADDRESS,DATE
"Eko S. Wibowo", "Tamanan, Banguntapan, Bantul, DIY", "6/27/1979"
Run Code Online (Sandbox Code Playgroud)

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

string[] line = s.Split(',');
Run Code Online (Sandbox Code Playgroud)

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

任何帮助将不胜感激!

unl*_*mit 22

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

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);
Run Code Online (Sandbox Code Playgroud)

这会给你:

Eko S. Wibowo
Tamanan, Banguntapan, Bantul, DIY
6/27/1979
Run Code Online (Sandbox Code Playgroud)

  • 一个更好的模式是`""?\ s*,\ s*""?`,以便它匹配没有双引号的列.有时CSV文件的数值不带双引号. (10认同)
  • 这是一个很好的解决方案,但只是注意不是每个CSV文件都会**始终**在每个值周围加上引号.我知道如果您从Excel创建一个CSV文件,它不会,只有值在值内有逗号,引号等. (3认同)

joe*_*joe 7

我用自己的方法完成了这个.它只计算"'字符的数量.
根据您的需求改进这一点.

    public List<string> SplitCsvLine(string s) {
        int i;
        int a = 0;
        int count = 0;
        List<string> str = new List<string>();
        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;
    }
Run Code Online (Sandbox Code Playgroud)