Как прочитать строку CSV с "? - PullRequest
6 голосов
/ 26 января 2010

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: Меня больше интересуют детали реализации, а не использование библиотеки.

Ответы [ 4 ]

9 голосов
/ 26 января 2010

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

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

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

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

Кстати, ваше решение для объединения будет работать на "Field1","Field2" или "Field1"",""Field2".

3 голосов
/ 26 января 2010

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

1 голос
/ 26 января 2010

Общая деталь реализации будет выглядеть примерно так (не проверено)

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 голос
/ 26 января 2010

Глава 4 Практики программирования дала реализации синтаксического анализатора CSV на C и C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...