17

假设我有这个 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 个令牌结束

任何帮助将不胜感激!

4

6 回答 6

27

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

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
于 2013-06-20T07:46:31.150 回答
9

我用我自己的方法做到了这一点。它只是计算数量"'字符。
根据您的需要进行改进。

    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;
    }
于 2013-06-20T07:32:06.440 回答
2

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

于 2013-06-20T08:02:25.650 回答
2

您可以替换",";然后拆分为;

var values= s.Replace("\",\"",";").Split(';');
于 2018-04-27T19:37:45.990 回答
0

如果您的 CSV 行紧凑,最简单的方法是使用前面提到的末端和尾部移除,然后在连接字符串上进行简单拆分

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

这只有在所有字段都被双引号括起来时才有效,即使它们(官方)不需要。它会比 RegEx 更快,但在使用时有给定的条件。

如果您的数据看起来像 "Name","1","12/03/2018","Add1,Add2,Add3","other stuff"

于 2018-04-25T21:20:15.987 回答
0

5 岁了,但总有人想要拆分 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;
        }
    }
}

更多讨论/相同问题: 处理 CSV 文件中的逗号

于 2018-12-01T09:02:32.710 回答