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

Posted

技术标签:

【中文标题】将其字段中带有逗号的 .csv 文件转换为 JSON/TXT【英文标题】:Transforming .csv file with commas within its fields to JSON/TXT 【发布时间】:2017-11-07 14:34:08 【问题描述】:

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

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

Tehnicne_podrobnosti,RESPONSE_DATE,RESPONSE_TIME

"Klikni za povečavo Dodaj v primejavo Dodatne slike: Intel Pentium® Dual-Core G4560 "BOX" Redna cena: 67,63€ Spletna cena: 62,62€普里哈内克: 5,01€ Garancija:36 mesecev EAN:5032037095693Tehničnipodatki:提示procesorja:奔腾双CoreJedro:Kaby LakeFrekvenca procesorja:3500MHzPodnožjeprocesorja:插座1151Tehnologija izdelave:0.014μmPredpomnilnik:3072 kBFrekvenca FSB / HT:提示jedra:双核OPIS:Dvojederni。处理器英特尔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 缓存 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 (线程): 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 primejavo Dodatne slike: Intel Core™ i5 7400 "BOX" Redna cena: 213,06€ Spletna cena: 197,29€普里赫拉内克: 15,77€ Garancija:36 mesecev EAN:5032037092982Tehničnipodatki:提示procesorja:睿™i5Jedro:Kaby LakeFrekvenca procesorja:3000MHzPodnožjeprocesorja:插座1151Tehnologija izdelave:0.014μmPredpomnilnik:6144 kBFrekvenca FSB / HT:提示jedra:四核OPIS:Štirijedrni。处理器Intel酷睿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 缓存 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 tempaturi procesorja obremenitvi dvigne frekvenco procesorja。 Pospešek je odvisen od števila obremenenjenih jeder.Dodatne lastnosti procesorja Intel® Core™ i5 7400:* Število niti(线程):4* GPU Frekvenca:做 1000 MHz* 提示 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"

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

【问题讨论】:

重命名文件:file.csv -> file.txt。如果你想做更多的事情,最好让你的问题更清楚。 如果您编辑问题以包含示例 CSV 文件中的前几行,将会有所帮助。 我编辑了它。我希望这会更好。 【参考方案1】:

问题似乎是"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 上测试

【讨论】:

代码有效,但问题是,我有多个不同的词,没有正确地双引号。我在想也许这个事实会有所帮助:-变量“Tehnicne_podrobnosti”总是以“Klikni”开头-下一个变量是“Request_url”总是以“http:/ /..." ..但我不知道如何解决它。 希望它现在适用于任何非双引号单词。

以上是关于将其字段中带有逗号的 .csv 文件转换为 JSON/TXT的主要内容,如果未能解决你的问题,请参考以下文章

Javascript中带逗号的数字

python 从KeepassX转换导出的XML文件,可以将其导入1Password(通过CSV逗号分隔文件)

我用 php 创建了一个脚本来将 xml 转换为 csv,但是所有结果都是垂直的,而不是在一行中带有标题

JMeter 使用同一列中带有逗号的值写入 CSV

无法将字段中带有 \" 的数据提取到 BigQuery 中

Jmeter CSV数据中带有逗号解决方法