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 в качестве механизма для определения разделителя.