【问题标题】:I've got a funky tab delimited file that I'd like to make less funky我有一个时髦的制表符分隔文件,我想让它变得不那么时髦
【发布时间】:2011-11-22 23:54:35
【问题描述】:

我有很多以制表符分隔的数据,这些数据被组织成多行,并且应该都在两行中。现在看起来像这样:

    Some Key    Other key   Foo Key    Bar Key
     0           5           18         12

    More Key    Dor key     Gee Key    Francis Scott  Key
     19          14          8          0

    Wa Key      Whis key    Don Key    Luh Key
     0           2           8          16

我需要它看起来像这样:

    Some Key    Other key   Foo Key    Bar Key    More Key    Dor key     Gee Key    Francis Scott  Key    Wa Key      Whis key    Don Key    Luh Key
     0           5           18         12         19          14          8          0                    0           2           8          16

我有几百个 csv 文件,每个文件大约 20 行,30 列,所以我想尽可能多地编写脚本。我正在使用Python CSV,但我不知道如何向它解释自己。

【问题讨论】:

  • 我唯一的想法是您可能必须进行两次传递:一次转换为水平格式,然后第二次转换为垂直格式(假设您不能一步完成) .分离两个逻辑可以使解决方案更容易看到。祝你好运!
  • @PeterRowell 困难的部分是说“对于每一行新的文本,将其拾取并将其移动到顶行的末尾”——当我在完成。
  • 我是否遗漏了什么,或者您能否删除每个备用 (~) 行结尾(即 \n
  • @malangi 我认为这不会有帮助。这将给我四列键和四列值。

标签: python csv


【解决方案1】:

应该这样做:

import csv
import sys

keys = []
values = []

reader = csv.reader(sys.stdin, delimiter="\t")
for row in reader:
    keys.extend(row)
    values.extend(next(reader))

    # skip empty line
    assert next(reader, []) == []

writer = csv.writer(sys.stdout, delimiter="\t")
writer.writerow(keys)
writer.writerow(values)

将其保存为 thingie.py 并使用 python thingie.py < sample.csv 运行它(其中“sample.csv”是您的数据文件)

【讨论】:

  • 不错!那里可能会显示一个额外的 TAB(至少在我的测试中是有的),但除此之外非常好。
  • 我在测试之前清理了示例数据。此处发布的内容实际上不是制表符分隔的,但我认为真实数据是。
  • 是的,真实数据是制表符分隔的。
  • 非常好。我只有两个问题。数据文件中是否有多个多行记录?如果是这样,这会将它们全部挤在一条线上。二、每条多行记录是否有相同的key?
  • @SpencerRathbun 它确实看起来像上面的数据:一行键,然后是一行值。接着是一个空行,然后是新的一行不同的键,然后是一行对应的值。 (重复 x8)。所以我确实想要两行:一行键和一行值。到目前为止效果很好。
【解决方案2】:

您可以使用制表符作为分隔符拆分文件的内容,将每个 int"eger 元素放入一个数组中,然后将每个字符串元素放入另一个数组中。然后,您将所有由制表符分隔的一行中的字符串(键),以及由制表符分隔的所有整数的一行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多