【问题标题】:changing the format of a tab delimited csv file更改制表符分隔的 csv 文件的格式
【发布时间】:2023-04-07 22:02:01
【问题描述】:

我收到了大量数据文件 (.txt),这些文件表示来自一个仪器的实验数据。这是一个例子:

141716:test: 1 width: 10distance: 13 time: 1690 x:2036.1222 y:696.022 target:1925-2175
141718:test: 2 width: 10distance: 29 time: 624 x:1646.027 y:814.01953 target:1525-1775
141719:test: 3 width: 10distance: 15 time: 688 x:504.4982 y:846.8401 target:375-375
141721:test: 4 width: 10distance: 22 time: 620 x:696.42004 y:922.6398 target:550-550
141722:test: 5 width: 10distance: 10 time: 709 x:366.33945 y:950.7717 target:250-250
141724:test: 6 width: 10distance: 7 time: 602 x:2181.1575 y:641.32117 target:2075-2325
141725:test: 7 width: 10distance: 8 time: 568 x:2207.414 y:741.3456 target:2050-2300
141726:test: 8 width: 10distance: 28 time: 490 x:1629.773 y:691.3334 target:1550-1800
141727:test: 9 width: 10distance: 23 time: 479 x:1811.6924 y:651.8706 target:1675-1925
141728:test: 10 width: 10distance: 26 time: 491 x:776.4396 y:851.138 target:650-650

由于所有其他数据文件都是 cvs,我已按照 Convert tab-delimited txt file into a csv file using Python 将它们转换为 csv 文件。我将如何将上述 csv 文件转换为第一行是每个数据的名称,后续行是数据的值的格式。我有大约一百个,所以不想手动完成。

【问题讨论】:

  • 这不是 CSV 文件。我们可以转换它,但是格式很糟糕。
  • 期望的输出是什么?
  • 所需的输出:时间戳、测试、宽度、距离、时间、x、y、目标在顶行,然后是下面每一行的值。在我可以将这些仪器数据与其他来源的数据进行匹配之前,我有大约 100 项工作要做。

标签: python csv


【解决方案1】:

这不是 CSV。格式太可怕了。例如,widthdistance 字段之间没有分隔符,有些字段在 : 冒号后有一个空格,而有些则没有。

您必须使用自定义代码进行处理,然后将其写入 CSV 文件:

import re
import csv

lineformat = re.compile(
    r'^(?P<count>\d+)[\s:]*'
    r'test[\s:]*(?P<test>\d+)[\s:]*'
    r'width[\s:]*(?P<width>\d+)[\s:]*'
    r'distance[\s:]*(?P<distance>\d+)[\s:]*'
    r'time[\s:]*(?P<time>\d+)[\s:]*'
    r'x[\s:]*(?P<x>\d+\.\d+)[\s:]*'
    r'y[\s:]*(?P<y>\d+\.\d+)[\s:]*'
    r'target[\s:]*(?P<target>\d+-\d+)[\s:]*'
)
fields = ('count', 'test', 'width', 'distance', 'time', 'x', 'y', 'target')

with open(inputfile) as finput, open(outputfile) as foutput:
    csvout = csv.DictWriter(foutput, fields=fields)
    for line in finput:
        match = lineformat.search(line)
        if match is not None:
            csvout.writerow(match.groupdict())

这使用带有命名组的正则表达式将行解析为字典,以便轻松写入 CSV 文件。我选择了“count”作为输入文件中第一个数值的名称,您可以随意更改它(但在正则表达式 fields 元组中都这样做)。

【讨论】:

  • 谢谢,这就是统计学家应该参加设计会议的原因!
  • 嗨 Martijn,我不断收到 TypeError: '_sre.SRE_Pattern' object is not callable when running that script: 你使用的是 pythin 2.7 吗?我正在使用 3.3。
  • @TomKealy:不,只是一个小错误:答案中缺少.search() 调用。 :-)
  • 坦克! :)。有点生气,我现在没有发现。
  • 嗨 Martjin,很抱歉再次打扰您。脚本运行,但产生空白输出。我只是一名统计学家,没有处理此类文件的专业知识。我该如何解决这个问题?
猜你喜欢
  • 2015-10-12
  • 1970-01-01
  • 2020-11-25
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多