CSV-файлы с кавычками и запятыми внутри полей

у меня есть стек CSV - файлов, которые я хочу разобрать-проблема в половине кавычек, используемых в качестве кавычек, и запятых внутри основного поля. Они на самом деле не CSV, но у них есть фиксированное количество полей, которые можно идентифицировать. Диалект=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.модуль чтения анализирует файл OK.

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

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

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

в lineterminator это \x0d x0a

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

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

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

3 ответов


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

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


вы пробовали передает 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"']

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