将字段中带有逗号的 .csv 文件转换为 JSON/TXT

Transforming .csv file with commas within its fields to JSON/TXT

我有一个逗号分隔的 .csv 文件,其中包含数据,在其字段中包含逗号(在文本中,用于小数等)。 数据的形状实际上是数据框,所以我稍后会使用 pandas。 如何使用 pandas 读取此类文件或将其转换为制表符分隔的 .txt 文件或 JSON 文件。

文件大小为 3.5 MB,大约有 700 行。下面,这是 header 和两行数据的示例。在文件中,没有空行 - 我在这里做了空行,只是为了使其更具可读性。 由于数据是网络抓取的,我不得不删除两个变量(响应和请求 url)。

Tehnicne_podrobnosti,RESPONSE_DATE,RESPONSE_TIME

"Klikni za povečavo Dodaj v primerjavo Dodatne slike: Intel Pentium® Dual-Core G4560 "BOX" Redna cena: 67,63€ Spletna cena: 62,62€ Prihranek: 5,01€ Garancija: 36 mesecev EAN : 5032037095693 Tehnični podatki: Tip procesorja:Pentium® Dual-CoreJedro:Kaby LakeFrekvenca procesorja:3500 MHzPodnožje procesorja:Socket 1151Tehnologija izdelave:0.014 µmPredpomnilnik:3072 kBFrekvenca FSB/HT: Tip jedra:Dual Core Opis: Dvojederni procesor Intel Pentium G4560 je del serije procesorjev s kodnim imenom Kaby Lake in je narejen v 14 nanometrskem proizvodnem procesu. Deluje na frekvenci 3,5 GHz. Na voljo je 3 MB Cache predpomnilnika. Za delovanje porablja do 54 W (TDP) energije. Za delovanje potrebujete osnovno ploščo s podnožjem LGA1151.Vgrajena je nova generacija Intelove integrirane grafike Intel® HD Graphics 610, ki deluje na frekvenci 350 MHz/1,15 GHz. Podpira DirectX 12, OpenGL 4.4 ter ločljivosti do 4096x2304 @60Hz preko DisplayPort in 4096x2304 @24Hz preko HDMI 1.4. Podpira do 3 zaslone naenkrat.Dodatne lastnosti procesorja Pentium® Dual-Core G4560:* Število niti (threads): 4* GPU Frekvenca: do 1050 MHz* Tip GPU: HD Graphics 610 (podpora DirectX 12)* TDP: 54 W* Podpora DDR3L: 1333/1600 MHz@ 1.35V* Podpora DDR4: 2133/2400 MHz* Inštrukcije: MMX, AES-NI, CLMUL, FMA3, SSE, SSE2, SSE3, SSSE3, SSE4, SSE4.1, SSE4.2, AVX, AVX2, TXT, TSX, SGX, VT-x","05.26.2017","10:01:50"

"Klikni za povečavo Dodaj v primerjavo Dodatne slike: Intel Core™ i5 7400 "BOX" Redna cena: 213,06€ Spletna cena: 197,29€ Prihranek: 15,77€ Garancija: 36 mesecev EAN : 5032037092982 Tehnični podatki: Tip procesorja:Core™ i5Jedro:Kaby LakeFrekvenca procesorja:3000 MHzPodnožje procesorja:Socket 1151Tehnologija izdelave:0.014 µmPredpomnilnik:6144 kBFrekvenca FSB/HT: Tip jedra:Quad Core Opis: Štirijedrni procesor Intel Core i5-7400 je del serije procesorjev s kodnim imenom Kaby Lake in je narejen v 14 nanometrskem proizvodnem procesu. Deluje na frekvenci 3,0 GHz, s Turbo Boost tehnologijo pa se frekvenca poveča na 3,5 GHz. Na voljo je 6 MB Cache predpomnilnika. Za delovanje porablja do 65 W (TDP) energije. Za delovanje potrebujete osnovno ploščo s podnožjem LGA1151.Vgrajena je nova generacija Intelove integrirane grafike Intel® HD Graphics 630, ki deluje na frekvenci 350 MHz/1,0 GHz. Podpira DirectX 12, OpenGL 4.4 ter ločljivosti do 4096x2304 @60Hz preko DisplayPort in 4096x2304 @24Hz preko HDMI 1.4. Podpira do 3 zaslone naenkrat.Ponuja do 16 PCI express linij.Tu je funkcija Turbo Boost 2.0, ki ob ustrezno nizki temperaturi procesorja ob obremenitvi dvigne frekvenco procesorja. Pospešek je odvisen od števila obremenenjenih jeder.Dodatne lastnosti procesorja Intel® Core™ i5 7400:* Število niti (threads): 4* GPU Frekvenca: do 1000 MHz* Tip GPU: HD Graphics 630 (podpora DirectX 12)* Turbo frekvenca: 3,5 GHz* TDP: 65 W* Podpora DDR3L: 1333/1600 MHz@ 1.35V* Podpora DDR4: 2133/2400 MHz* Inštrukcije: MMX, AES-NI, CLMUL, FMA3, SSE, SSE2, SSE3, SSSE3, SSE4, SSE4.1, SSE4.2, AVX, AVX2, TXT, TSX, SGX, VT-x, VT-d","05.26.2017","10:01:58"

对最有效的解决方案有什么建议吗?

问题似乎是 "BOX" 没有正确地用双引号引起来。一种解决方法是将其用双引号括起来,然后将其传递给 Python 的 CSV 以创建该行。然后可以使用这些加载到数据帧中:

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_DATERESPONSE_TIME 列也已合并并转换为 datetime 对象。

4 假定有四个正常列和一个有问题的列,即为了测试我模拟了额外的两列以具有响应代码和 URL。 在 Python 2.x

上测试