Тривиальной строке CSV можно было досадить с помощью строковой функции разделения. Но некоторые строки могли иметь "
, например.
"good,morning", 100, 300, "1998,5,3"
таким образом непосредственно использующее строковое разделение не решило бы проблему.
Мое решение состоит в том, чтобы сначала разделить использование строки ,
и затем комбинируя строки с "
в затем начинаются или конец строки.
Какова лучшая практика для этой проблемы?
Мне интересно, если существует Python или фрагмент кода F# для этого.
Править: Я больше интересуюсь деталью реализации, вместо того, чтобы пользоваться библиотекой.
Там модуль модуль в Python, который обрабатывает это.
Редактировать : эта задача попадает в категорию «построить лексера». Стандартный способ выполнения таких задач состоит в том, чтобы построить государственный автомат (или использовать библиотеку Lexer / Framework, которая сделает это для вас.)
Государственный автомат для этой задачи, вероятно, понадобится только два состояния:
Кстати, ваше сопряженное решение нарушится на «Поле1», «Поле2»
или «Поле1» «», «Поле2»
.
Из модуль 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 .
Если вы заинтересованы в деталях, прочитайте « Split String в запятых, уважающих котировки, когда строка не в формате CSV « Отображение некоторого приятного Regexen, связанного с этой проблемой, или просто прочитайте источник модуля CSV.
Глава 4 практики программирования давала как CS и C ++ анализатора CSV.
Общей подробностью реализации было бы что-то вроде этого (непроверенного)
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:]