【问题标题】:Python: Issue with delimiter inside column dataPython:列数据内的分隔符问题
【发布时间】:2017-09-01 05:52:10
【问题描述】:

这与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阅读器解析并不能解决问题(skipinialspace不是问题),shlex没有用,StringIO也没有帮助......

我最初的想法是逐行导入,并替换';'行中逐个元素。 但是导入是个问题,因为它会在每个 ';' 上分裂。

数据来自具有 300.000+ 行的较大文件(并非所有行都有此问题)。 欢迎任何建议。

【问题讨论】:

标签: python python-3.x csv


【解决方案1】:

由于您知道输入字段的数量,并且只有一个字段格式错误,您可以简单地拆分;,然后将中间字段合并为一个:

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'...

【讨论】:

  • 感谢您的回答,谢尔盖。有时,这是一个效果最好的简单解决方案。
【解决方案2】:

您可以使用标准的 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))

【讨论】:

  • 这不起作用。列之间没有初始空间。不过,感谢您的帮助。
  • 没有初始空间是什么意思?如果没有初始空间,则只需删除 skipinitialspace 参数即可。
  • Python 会,例如,在 10;100 上分割(它不应该在这个位置上)。
  • 好的,没有看到您需要加入的 10;100 Mbit。而不是加入列表的第 3 和第 4 个元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 2017-10-17
  • 2021-10-04
  • 1970-01-01
  • 2017-06-21
  • 2022-08-05
相关资源
最近更新 更多