2011-01-18 6 views
5

У меня есть файл CSV (который я не создавал, и я не могу изменить сейчас и не смогу его изменить), который содержит следующие строки:Разделение строки на запятую, когда данные могут содержать запятые

"Surname, Firstname", yes, no, somestring, whatever, etc

Как вы можете видеть здесь, первый , не запятая, на котором я хотел бы разделить строку. Обратите внимание, что эта конкретная запятая заключена в кавычки.

Из-за этого, просто string.split(','), очевидно, не будет работать, так как это даст мне массив длины 7 для указанных выше строк вместо 6.

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

Я могу придумать уродливые, хакерские способы сделать это, прочитав каждый символ строки char, но это должно быть последним средством, поскольку я уверен, что есть лучший способ сделать это!

+0

Это выглядит как .csv из Excel. Всегда весело. Больше удовольствия, когда данные содержат цитаты и запятые ... –

+0

Это не на самом деле из Excel, но да, весело! :) Это из местоположения в сети, моя программа читает файл и пытается его разобрать. – AndrewC

+1

Чтение одного персонажа за раз не обязательно является уродливым взломом. Я бы рекомендовал найти C# CSV-парсер, так как я уверен, что такие вещи уже существуют. –

ответ

1

Я знаю, что здесь много людей, которые считают, что сравнение по-символам никогда не должно использоваться и сильно не согласуется со мной, но я не убежден, что такие компании, как Microsoft, не только те, кто должен это делать вроде программирования.

Afterall, Split выполняет сопоставления по символам, так почему же он менее уродлив, когда вы вызываете существующий код, который не совсем делает именно то, что вы хотите?

Во всяком случае, мой подход заключался в том, чтобы написать собственный код. И я разместил код в Интернете по адресу http://www.blackbeltcoder.com/Articles/files/reading-and-writing-csv-files-in-c.

+0

Спасибо, Джонатан. Я немного смущен, как использовать ваш код, я не уверен, почему мне нужно передать параметр ReadRow()? – AndrewC

+0

Параметр заполняется считываемыми данными. –

+0

Работал отлично! Спасибо Джонатан. – AndrewC

5

Вы можете легко справиться с этим, используя TextFieldParser class. Просто установите для HasFieldsEnclosedInQuotes значение true.

+0

Вы ссылаетесь на визуальный базовый класс .NET 4.5, когда это было опубликовано как вопрос C#. – aggaton

+2

@aggaton Просто потому, что тип находится в пространстве имен Microsoft.VisualBasic, не означает, что он не может использоваться с C#. 'TextFileParser' отлично работает с C#, и это часть основной структуры - нет причин ее избегать. –

+0

@ReedCopsey это 'TextFieldParser', хотя и не' TextFileParser'. Вам удалось сослаться на правильную вещь, но последовательно писать это неправильно. – Nyerguds

2

Я бы предложил использовать библиотеку анализатора CSV - есть другие случаи, о которых вы бы даже не подумали (новая строка как часть поля с кавычками).

В пространстве имен VisualBasic есть хорошая библиотека, которая может помочь - TextFieldParser.

+1

C# разработчикам не стоит беспокоиться о пространстве имен VisualBasic. Не имеет значения IRL, не добавляет никаких зависимостей, которые не находятся на машине, и т. Д. – Will

+0

Красиво, и как @Will сказал, отлично работает при использовании в C#. Почему Microsoft скрывает такие инструменты в таких странных местах? – Nyerguds

Смежные вопросы