Как считать строку CSV с"?

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

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

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

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

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

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

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

6
задан Yin Zhu 26 January 2010 в 14:24
поделиться

4 ответа

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

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

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

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

Кстати, ваше сопряженное решение нарушится на «Поле1», «Поле2» или «Поле1» «», «Поле2» .

9
ответ дан 8 December 2019 в 17:21
поделиться

Из модуль 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.

3
ответ дан 8 December 2019 в 17:21
поделиться

Глава 4 практики программирования давала как CS и C ++ анализатора CSV.

1
ответ дан 8 December 2019 в 17:21
поделиться

Общей подробностью реализации было бы что-то вроде этого (непроверенного)

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:]
1
ответ дан 8 December 2019 в 17:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: