Как читать строку CSV с помощью?

Тривиальная строка CSV может быть использована с использованием функции разделения строк. Но некоторые строки могут иметь " , например

 "good,morning", 100, 300, "1998,5,3" 

поэтому прямое использование разделения строк не решит проблему.

Мое решение состоит в том, чтобы сначала разделить линию, используя , а затем объединив строки с " в начале или в конце строки.

Какова наилучшая практика для этой проблемы?

Мне интересно, если для этого есть фрагмент кода Python или F #.

EDIT: меня больше интересует деталь реализации, а не использование библиотеки.

4 Solutions collect form web for “Как читать строку CSV с помощью?”

В Python есть модуль csv , который обрабатывает это.

Изменить : эта задача относится к категории «построить лексер». Стандартный способ выполнения таких задач – создать конечный автомат (или использовать библиотеку / фреймворк lexer, которая сделает это для вас).

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

  • Исходный, где он читает каждый символ, кроме запятой и новой строки, как часть поля (исключение: начальное и конечное пространства), запятая как разделитель полей, новая строка как разделитель записей. Когда он встречает открытую цитату, он переходит в
  • read-quoted-field state, где каждый символ (включая запятую и новую строку), исключая цитату, рассматривается как часть поля, цитата, не сопровождаемая цитированием, означает конец поля с цитированием прочитанного (назад к исходному состоянию), последующая цитата по цитате рассматривается как одиночная кавычка (экранированная цитата).

Кстати, ваше конкатенирующее решение сломается на "Field1","Field2" или "Field1"",""Field2" .

Из модуля CSV python :

чтение обычного файла CSV:

 import csv reader = csv.reader(open("some.csv", "rb")) for row in reader: print row 

Чтение файла с альтернативным форматом:

 import csv reader = csv.reader(open("passwd", "rb"), delimiter=':', quoting=csv.QUOTE_NONE) for row in reader: print row 

В LinuxJournal.com есть несколько примеров использования .

Если вы заинтересованы в деталях, прочитайте « разделите строку в запятых, соблюдая кавычки, когда строка не в формате csv » показывает какое-то приятное регулярное выражение, связанное с этой проблемой, или просто прочитайте источник модуля csv.

В главе 4 «Практика программирования» даны как C, так и C ++ реализации парсера CSV.

Общая деталь реализации была бы чем-то вроде этого (untested)

 def csvline2fields(line): fields = [] quote = None while line.strip(): line = line.strip() if line[0] in ("'", '"'): # Find the next quote: end = line.find(line[0]) fields.append(line[1:end]) # Find the beginning of the next field next = line.find(SEPARATOR) if next == -1: break line = line[next+1:] continue # find the next separator: next = line.find(SEPARATOR) fields.append(line[0:next]) line = line[next+1:] 
  • как вычислить краткое геодезическое расстояние пути матрицы смежности csv ?
  • Как я могу читать файл CSV за строкой, отслеживая заголовки столбцов?
  • Сохраните тот же контент в CSV-файле как команда печати
  • Поиск файлов CSV (Python)
  • Почему значения словаря переопределяются в конце этого цикла?
  • Как добавить заголовок в файл csv в Python?
  • Чтение и запись CSV-файлов, включая unicode с Python 2.7
  • Как я могу использовать атрибут fields_to_export в BaseItemExporter для заказа моих данных CSV Scrapy?
  • Pandas.read_csv () MemoryError
  • Объединение нескольких CSV-файлов без повторения заголовков (с использованием Python)
  • как читать файл excel в Google App Engine
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.