CSV-файлы с кавычками и запятыми внутри полей - PullRequest
8 голосов
/ 11 февраля 2012

У меня есть стек CSV-файлов, которые я хочу проанализировать - проблема в том, что половина имеет кавычки, используемые в качестве кавычек, и запятые внутри основного поля. Они на самом деле не CSV, но у них есть фиксированное количество полей, которые можно идентифицировать. Параметр dialect = csv. "Excel" отлично работает с файлами без лишних "и символов в поле.

Эти данные старые / не поддерживаются. Я пытаюсь протолкнуть в него немного жизни.

например.

"AAAAA
AAAA
AAAA
AAAA","AAAAAAAA


AAAAAA
AAAAA "AAAAAA" AAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAA, AAAAA
AAAAAAAAA AAAAA AAAAAAAAAA
AAAAA, "AAAAA", AAAAAAAAA
AAAAAAAA AAAAAAAA
AAAAAAA
"

Это отключает анализатор файлов и выдает ошибку _csv.Error: newline inside string. Я сократил это до этой проблемы, удалив кавычки из 2-го поля, и модуль csv.reader анализирует файл ОК.

Некоторые поля многострочные - я не уверен, важно ли это знать.

Я ковырялся в настройках диалекта, и, хотя я могу найти 'skipinitialspace', похоже, это не решает проблему.

Для ясности - это недопустимый 'CSV', его объекты данных, которые слабо следуют структуре CSV, но имеют и "символы внутри полевого теста".

Определитель строк: \ x0d \ x0a

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

Я не могу быть уверен, что комбинация "или" существует только на границах поля.

Эта проблема существует только для одного (последнего) из нескольких полей в файле, и существует несколько тысяч файлов.

Ответы [ 3 ]

11 голосов
/ 11 февраля 2012

Вы пытались передать csv.QUOTE_NONE через ключевое слово quoting arg?Не имея некоторого кода или данных для проверки этого, у меня нет способа узнать, работает ли это на ваших данных, но, похоже, оно работает с предоставленным вами фрагментом.

>>> import csv
>>> r = csv.reader(open('foo.csv', 'rb'), quoting=csv.QUOTE_NONE)
>>> for row in r: print row
... 
['"A"', '"B"', '"ccc "ccccccc" cccccc"']
3 голосов
/ 11 февраля 2012

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

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

2 голосов
/ 11 февраля 2012

Я бы написал конвертер, который бы анализировал исходный csv и выводил действительный. Возможно, вы можете использовать ", или" \ n в качестве механизма определения разграничения.

...