Разделить строку CSV

Как бы я разделил следующую строку?

test, 7535, '1,830,000', '5,000,000'

Результат должен быть

test
7535
'1,830,000'
'5,000,000'

Я попробую:

Dim S() as string = mystring.split(",")

Но я понимаю,

test
7535
'1
830
000'
'5
000
000'

Спасибо


person Community    schedule 06.06.2009    source источник


Ответы (3)


Не анализируйте CSV вручную, если у вас есть удобные доступные качественные библиотеки. Пожалуйста!

Парсинг CSV имеет много потенциальных ловушек, и эта библиотека, согласно моему тестированию, аккуратно решает большинство из них.

Тем не менее, если это разовая задача, а строки всегда такие, как в вашем примере, вы можете использовать регулярное выражение, например так (синтаксис VB.NET может быть неправильным, исправьте):

        Dim s as string = "1, 2, '1,233,333', '8,444,555'";
        Dim r as Regex = new Regex(",\s");
        Dim re() as string = r.Split(s);

Это рассчитано на то, что после разделительной запятой всегда есть пробел и что между запятыми нет пробела. Если это не всегда так, вы можете:

  • Сделайте регулярное выражение более сложным (см. здесь чтобы увидеть, насколько грязными могут быть вещи)
  • Пользуйтесь библиотекой и будьте счастливее
person Vinko Vrsalovic    schedule 06.06.2009
comment
Я не согласен с необходимостью обязательно использовать библиотеку CSV. Если вы знаете, что CSV-файл правильно отформатирован, то простой метод с использованием ReadLine и Split прекрасно справится с этой задачей. - person Noldorin; 06.06.2009
comment
Однако в данной ситуации это действительно целесообразно, учитывая, что в полях есть числа, разделенные запятыми. - person Noldorin; 06.06.2009
comment
То есть вы говорите, что полностью со мной согласны :) - person Vinko Vrsalovic; 06.06.2009
comment
Ребята, отличное парное программирование :) - person D'Arcy Rittich; 06.06.2009
comment
Вы предполагаете, что OP анализирует ценность файла CSV. Принятие зависимости от библиотеки синтаксического анализа CSV, безусловно, было бы излишним для разделения строки (о чем и просили). - person Mark Brackett; 06.06.2009
comment
@Mark: я согласен, и это одно из значений, которое я имел в виду под «разовой задачей» (третий абзац). Поскольку мне кажется очень вероятным, что он на самом деле анализирует файл CSV, а не только одну строку, я добавил предупреждение. Кроме того, эта библиотека очень маленькая и эффективная, так что это не проблема. - person Vinko Vrsalovic; 06.06.2009
comment
Это безумие. Почему бы не использовать встроенный класс TextParser? - person Adam Zuckerman; 20.02.2014

Если только для этого примера не нужно использовать регулярное выражение, Split-функция (входит в состав Microsoft.VisualBasic.Strings) может принимать строку в качестве разделителя, поэтому просто введите ", ", чтобы поймать только те запятые, после которых есть пробел:

    Dim s As String = "1, 2, '1,233,333', '8,444,555'"
    Dim r() As String = Split(s, ", ")
person Stefan    schedule 27.06.2011

Попробуйте использовать это регулярное выражение: "('([^']|'')*'|[^',\r\n]*)(,|\r\n?|\n)?"

person iburlakov    schedule 06.06.2009