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

时间:2011-01-28 15:16:51

标签: c# .net arrays string 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"

有一种简单的方法吗?已编写的库或是否必须按字符解析字符串?

4 个答案:

答案 0 :(得分:6)

关于代码项目的"A Fast CSV Reader"文章。我已多次愉快地使用它了。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

  1. 正则表达式匹配逗号在封闭的双重aprostophe
  2. 中找不到
  3. A Fast CSV Reader - 仅适用于读取CSV
  4. FileHelpers Library 2.0 - 用于读/写CSV
  5. 希望这有帮助。

答案 3 :(得分:1)

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

    private string[] splitQuoted(string line, char delimeter)
    {
        string[] array;
        List<string> list = new List<string>();
        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;
    }