【问题标题】:Split a CSV if specific string in row is found (Python/Pandas/Bash)如果在行中找到特定字符串,则拆分 CSV(Python/Pandas/Bash)
【发布时间】:2019-11-13 15:34:47
【问题描述】:

我有一个糟糕的 CSV 文件,里面有多个标题。它看起来像这样:

File1:
    #HEADER COL1 COL2
    data
    data
    data
    #HEADER COL1 COL2 COL3
    data
    data
    data
    data
    data
    #HEADER COL1 COL2 COL3 COL4
    data
    data
    ...

由于文件内标头,我无法使用 pandas 加载它,因此我希望将每个标头的数据拆分为单独的文件(或 pandas 中的单独数据框)。有没有办法做到这一点?

此 CSV 由传感器生成。如果添加了传感器,标题将获得一个新列。这也可能发生在 in-the-file-headers 中。因此,删除这些标题不是解决方案。 (Clean wrong header inside Dataframe with Python/Pandas)

在 python/pandas 中执行此操作非常好,但我也会对 bash 命令/脚本解决方案感到满意。

预期输出:

File1:
        #HEADER COL1 COL2
        data
        data
        data
File2:
        #HEADER COL1 COL2 COL3
        data
        data
        data
        data
        data
File3:
        #HEADER COL1 COL2 COL3 COL4
        data
        data
        ...

谢谢!

【问题讨论】:

  • 您是否能够显示您的预期输出以及您尝试过的内容?
  • 那些HEADER 行总是一样的吗?你能发表一个现实的意见吗?
  • 没有 HEADER 行可以更改(但它们都以“#”开头)。所以如果我能找到“#”,我就可以拆分文件

标签: pandas bash csv split header


【解决方案1】:

awk 来救援!

$ awk '/^#HEADER/{close(FILENAME "_" c); c++} {print > (FILENAME "_" c)}' file

将输入 file 拆分为 file_n 部分,其中 n 是节计数器。

【讨论】:

  • 在我的情况下,这很好用! awk '/^#/{close(FILENAME "_" c); c++} {print > (FILENAME "_" c)}' file
  • 最后一个问题:如何将结果文件导出到另一个文件夹?
【解决方案2】:

使用方便的 csplit 命令(按模式将文件拆分为多个部分):

csplit -b %d -f file -z input_file '/#HEADER.*/' '{*}'

查看结果:

$ head file[0-9]
==> file0 <==
#HEADER COL1 COL2
data
data
data

==> file1 <==
#HEADER COL1 COL2 COL3
data
data
data
data
data

==> file2 <==
#HEADER COL1 COL2 COL3 COL4
data
data
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2013-02-18
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多