csv 列数据中的分隔符问题

avwztpqn  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(115)

这不是another question的重复,因为我不想删除行。上述帖子中接受的答案与此非常不同,并且不是旨在维护所有数据。

**问题:**格式不正确的csv文件中列数据内的分隔符
**尝试过的解决方案:**csv模块、shlex、StringIO(SO上没有工作方案)
示例数据

分隔符位于第三个数据字段内,由(多个)双引号括起:

08884624;6/4/2016;Network routing 21,5\"\" 4;8GHz1TB hddQwerty\"\";9999;resell:no;package:1;test
0085658;6/4/2016;Logic 111BLACK.compat: 29,46 cm (11.6\"\")deep: 4;06 cm height: 25;9 cm\"\";9999;resell:no;package:1;test
4235846;6/4/2016;Case Logic. compat: 39,624 cm (15.6\"\") deep: 3;05 cm height: 3 cm\"\";9999;resell:no;package:1;test
400015;6/4/2016;Cable\"\"Easy Cover\"\"\"\";1;5 m 30 Silver\"\";9999;resell:no;package:1;test
9791118;6/4/2016;Network routing 21,5\"\" (2013) 2;7GHz\"\";9999;resell:no;package:1;test
477000;6/4/2016;iGlaze. deep: 9,6 mm (67.378\"\") height: 14;13 cm\"\";9999;resell:no;package:1;test
4024001;6/4/2016;DigitalBOX. tuner: Digital, Power: 20 W., Diag: 7,32 cm (2.88\"\"). Speed 10;100 Mbit/s\"\";9999;resell:no;package:1;test

所需样本输出

固定长度7:

['08884624','6/4/2016', 'Network routing 21,5\" 4,8GHz1TB hddQwerty', '9999', 'resell:no', 'package:1', 'test']

通过csv阅读器解析并不能解决这个问题(skipinitialspace不是问题),shlex没有用,StringIO也没有帮助。
我最初的想法是逐行导入,并替换';'行中逐个元素。但进口是个问题,因为它在每个'分裂;'.
数据来自一个包含300.000+行的更大的文件(并非所有行都有这个问题)。任何建议都欢迎。

r8uurelv

r8uurelv1#

由于您知道输入字段的数量,并且只有一个字段的格式不正确,因此您可以简单地在;上进行拆分,然后将中值字段合并为一个字段:

for line in file:
    temp_l = line.split(';')
    lst = temp_l[:2] + [ ';'.join(l[2:-4]) ] + l[-4:] #lst should contain the expected fields

我甚至没有尝试处理双引号,因为我无法理解如何从Network routing 21,5\"\" 4;8GHz1TB hddQwerty\"\"传递到'Network routing 21,5\" 4,8GHz1TB hddQwerty'

gmxoilav

gmxoilav2#

你可以使用标准CSV模块。
要实现您正在尝试完成的,只需将CSV分隔符更改为';'
在终端中测试以下内容:

import csv 
test = ["4024001;6/4/2016;DigitalBOX. tuner: Digital, Power: 20 W., Diag: 7,32 cm (2.88\"\"). Speed 10;100 Mbit/s\"\";9999;resell:no;package:1;test"]

delimited_colon = list(csv.reader(b, delimiter=";", skipinitialspace=True))

相关问题