Разделение CSV и исключение запятых внутри элементов - PullRequest
3 голосов
/ 28 января 2011

У меня есть строка 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 ]

6 голосов
/ 28 января 2011

Статья "Быстрый CSV-ридер" о Code Project.Я использовал это много раз.

2 голосов
/ 28 января 2011

String.Split () непривычно для этого. Мало того, что у него есть неприятные угловые случаи, когда он не работает, как тот, который вы только что нашли (и другие, которые вы еще не видели), но производительность также не идеальна. FastCSVReader, опубликованный другими, будет работать, в фреймворк встроен приличный парсер csv (Microsoft.VisualBasic.TextFieldParser), и у меня есть простой парсер, который ведет себя корректно, отправленный на этот вопрос .

1 голос
/ 10 января 2013

Это не самое элегантное решение, но самое быстрое, если вы хотите просто быстро скопировать и вставить код (без необходимости импортировать библиотеки 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;
    }
1 голос
/ 28 января 2011

Я бы предложил использовать одно из следующих решений, просто протестировал несколько из них (отсюда и задержка): -

  1. Соответствующие регулярному выражению запятые не найдены в пределах двойного апростофа
  2. Быстрый CSV Reader - только для чтения CSV
  3. FileHelpers Library 2.0 - для чтения / записи CSV

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...