Преобразование файла.csv с запятыми в его полях в JSON/TXT
У меня есть файл с разделителями-запятыми.csv с данными, которые содержат запятые в своих полях (в тексте, для десятичных дробей и т. Д.). Форма данных фактически является фреймом данных, поэтому я буду использовать панды позже. Как мне прочитать такой файл с пандами или альтернативно преобразовать его в текстовый файл с разделителями табуляции или файл JSON.
Файл размером 3,5 МБ и имеет около 700 строк. Ниже приведен пример заголовка и двух строк данных. В файле нет пустых строк - я сделал их здесь, просто чтобы сделать его более читабельным. Поскольку данные удаляются из Интернета, мне пришлось удалить две переменные (ответ и URL запроса).
Tehnicne_podrobnosti, RESPONSE_DATE, RESPONSE_TIME
"Кликните для повествования Додай в пример Додатне похож: Двухъядерный процессор Intel Pentium® G4560 "BOX"Цена: 67,63€ Цена: 62,62€ Цена: 5,01€ Гарантия: 36 месяцев EAN: 5032037095693 Техника: цена Тип процессора:Pentium® Dual-CoreJedro: Процессор Kaby LakeFrekvenca: 3500 МГцПроцессор процессора: Socket 1151Технология издела: 0,014 мкмПредназначение:3072 кБФреквенца FSB/HT: Совет для двухъядерных процессоров: новое поколение процессоров: новое поколение процессоров: современное программное обеспечение для бизнеса Озеро в первом в 14 нанометровом производственном процессе. Деление на частоте 3,5 ГГц. Intelove встроенный графический процессор Intel® HD Graphics 610, работающий на частоте 350 МГц /1,15 ГГц. Podpira DirectX 12, OpenGL 4.4 тер. Для до 4096x2304 при 60 Гц preko DisplayPort в 4096x2304 при 24 Гц preko HDMI 1.4. Podpira do 3 zaslone naenkrat. Дополнительная информация о процессоре Pentium® Dual-Core G4560:* Стервило нитей (потоков): 4* Графический процессор Frekvenca: до 1050 МГц * Совет GPU: HD Графика 610 (подпора DirectX 12)* TDP: 54 Вт * Подпора DDR3L: 1333/1600 МГц при 1,35 В * Podpora DDR4: 2133/2400 МГц * Insttrukcije: MMX, AES-NI, CLMUL, FMA3, SSE, SSE2, SSE3, SSSE3, SSE4, SSE4.1, SSE4.2, AVX, AVX2, TXT, TSX, SGX, VT-x"," 26.05.2017 "," 10:01:50 "
"Кликните для повествования Додай в пример Додатне похож: Intel Core™ i5 7400 "BOX"Цена: 213,06€ Цена: 197,29€ Цена: 15,77€ Гарантия: 36 месяцев EAN: 5032037092982 Тип процесса::Core™ i5Jedro: Процессор Kaby LakeFrekvenca: 3000 МГцПодключение процессора: Socket 1151Технология отдел: 0,014 мкмПредпоследовательность:6144 кБ Frekvenca FSB/HT: Совет по продукту: Процессор Quad Core и данные в 14 нанометрах по производственному процессу. Деление на частоту 3,0 ГГц, с Turbo Boost технология по частоте поворота на 3,5 ГГц. На волне е 6 МБ Кэш-память предпоследнего. За работу по 65 Вт (ZDP) энергии. Вы можете ознакомиться с основными данными LGA1151.Изображение и интеграция графики Intelove Intel® HD Graphics 630, посвященные частоте 350 МГц /1,0 ГГц, показаны в формате OpenGL 4.4 и выше. 4096x2304 при 24 Гц преко HDMI 1.4. Подпора до 3-х заслонов.Понуя до 16 PCI Express линий.Ту и функционал Turbo Boost 2.0, к которому относятся низко температурные процессоры об обмене двигатели frekvenco процессоры. Послание в односторонний процессор. Процессор Intel® Core™ i5 7400:* Скорость передачи данных (потоки): 4* GPU Frekvenca: до 1000 МГц * Совет GPU: HD Graphics 630 (подпора DirectX 12)* Turbo Frekven: Turbo Frekven:, 5 ГГц * TDP: 65 Вт * Podpora DDR3L: 1333/1600 МГц @ 1,35 В * Podpora DDR4: 2133/2400 МГц * Insttrukcije: MMX, AES-NI, CLMUL, FMA3, SSE, SSE2, SSE3, SSSE3, SSE4, SSE4.1, SSE4.2, AVX, AVX2, TXT, TSX, SGX, VT-x, VT-d"," 26.05.2017","10:01:58"
Любые предложения для наиболее эффективных решений?
1 ответ
Проблема в том, что "BOX"
не правильно двойные кавычки. Одним из обходных путей может быть двойная кавычка, а затем передача ее в CSV-файл Python для создания строки. Затем их можно использовать для загрузки в фрейм данных:
import csv
from StringIO import StringIO
import pandas as pd
data = []
with open('input.csv', 'r') as f_input:
for line_number, raw_row in enumerate(f_input, start=1):
cols = raw_row.rsplit(',', 4)
cols[0] = '"{}"'.format(cols[0].strip('"').replace('"', '""'))
row = next(csv.reader(StringIO(','.join(cols))))
data.append(row)
df = pd.DataFrame(data[1:], columns=data[0])
df['DATE_TIME'] = pd.to_datetime(df.RESPONSE_DATE + " " + df.RESPONSE_TIME, format="%m.%d.%Y %H:%M:%S")
df.drop(['RESPONSE_DATE', 'RESPONSE_TIME'], axis=1, inplace=True)
print df
Это работает, предполагая, что только в первом столбце есть проблемы с двойными кавычками. Он дважды разбивает необработанную строку, удаляет внешние двойные кавычки из первого столбца, а затем заменяет все "
с ""
, Затем он восстанавливает исходную необработанную строку и передает ее в CSV для создания строки.
Даю вам:
Tehnicne_podrobnosti RESPONSE_CODE URL DATE_TIME
0 Klikni za povečavo Dodaj v primerjavo Dodatne ... 405 http:// 2017-05-26 10:01:50
1 Klikni za povečavo Dodaj v primerjavo Dodatne ... 404 http:// 2017-05-26 10:01:58
RESPONSE_DATE
а также RESPONSE_TIME
столбцы также были объединены и преобразованы в datetime
объект.
4
Предполагается, что есть четыре нормальных столбца и один с проблемами, т. е. для тестирования я смоделировал дополнительные два столбца, чтобы иметь код ответа и URL. Проверено на Python 2.x