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

时间:2013-06-20 07:04:22

标签: c#

假设我有这个CSV文件:

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

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

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

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

任何帮助将不胜感激!

6 个答案:

答案 0 :(得分:20)

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

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

答案 1 :(得分: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;
    }

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

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

这仅适用于所有字段都是双引号的,即使它们不是(官方)需要的。它会比RegEx更快,但在使用时会有特定的条件。

如果您的数据看起来非常有用 &#34;姓名&#34;,&#34; 1&#34;,&#34; 12/03/2018&#34;,&#34; Add1,Add2,Add3&#34;,&#34;其他内容& #34;

答案 4 :(得分:0)

您可以将","替换为;,然后将其分隔为;

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

答案 5 :(得分:0)

五岁了,但总有人想拆分CSV。

如果您的数据既简单又可预测(即从来没有像逗号,引号和换行符这样的特殊字符),则可以使用split()或正则表达式来实现。

但是要正确地支持CSV格式的所有细微差别而无须代码补给,您应该真正使用一个已经掌握所有魔术的库。不要重新发明轮子(除非您这样做当然是为了好玩)。

CsvHelper非常简单易用:

https://joshclose.github.io/CsvHelper/2.x/

using (var parser = new CsvParser(textReader)
{
    while(true)
    {
        string[] line = parser.Read();

        if (line != null)
        {
            // do something
        }
        else
        {
            break;
        }
    }
}

更多讨论/相同问题: Dealing with commas in a CSV file