【问题标题】:Split csv file vertically using command line使用命令行垂直拆分csv文件
【发布时间】:2018-06-16 13:03:33
【问题描述】:

是否可以将 csv 文件垂直拆分为多个文件?我知道我们可以将单个大文件拆分为较小的文件,而无需使用命令行提及任何行。我有 csv 文件,其中的列在某个列号之后重复,我想按列拆分该文件。这可以通过命令行实现吗?如果没有,那么我们如何使用 python 来做到这一点?

例如。

考虑上面的示例,其中站点和地址垂直多次出现,我想创建 3 个不同的 csv 文件,其中包含单个站点和单个地址

任何帮助将不胜感激,

谢谢

【问题讨论】:

  • 您可能有兴趣查看cut 命令
  • 确实 cut 是你的朋友。如果您想要一个适应的解决方案,请提供一个实际的输入示例
  • @ishahak,我刚刚编辑了这个问题,所以基本上我想将这些文件转换为多个文件,每个文件应该只包含 2 行,即站点和地址
  • @ishahak,我有这个好习惯,谢谢:)

标签: python bash csv command-line command


【解决方案1】:

以下脚本会生成您想要的内容(基于根据您的需要调整的SO answer:列数、字段分隔符)。它将原始文件垂直拆分为 2 个列块(注意 n=2)并创建 3 个不同的文件(tmp.examples.1tmp.examples.2tmp.examples.3 或您为 f 变量指定的任何文件):

awk -F "," -v f="tmp.examples" '{for (i=1; i<=NF; i++) printf (i%n==0||i==NF)?$i RS:$i FS > f "." int((i-1)/n+1) }' n=2 example.txt

如果你的example.txt文件有后续数据:

site,address,site,address,site,address
Google,google.com,MS,microsoft.com,Apple,apple.com

【讨论】:

    【解决方案2】:

    如果站点-地址对定期重复,那么:

    awk '{
        n = split($0, ary, ",");
        for (i = 1; i <= n; i += 2) {
            j = (i + 1) / 2;
            print ary[i] "," ary[i+1] >> "file" j ".csv";
        }
    }' input.csv
    

    【讨论】:

      【解决方案3】:

      假设您的输入文件名为 ~/Downloads/sites.csv,如下所示:

      Google,google.com,Google,google.com,Google,google.com
      MS,microsoft.com,MS,microsoft.com,MS,microsoft.com
      Apple,apple.com,Apple,apple.com,Apple,apple.com
      

      您可以使用 cut 创建 3 个文件,每个文件包含一对公司/站点:

      cut -d "," -f 1-2 < ~/Downloads/sites.csv > file1.csv
      cut -d "," -f 3-4 < ~/Downloads/sites.csv > file2.csv
      cut -d "," -f 5-6 < ~/Downloads/sites.csv > file3.csv
      

      解释:

      对于 cut 命令,我们将逗号 (,) 声明为分隔符,它将每一行拆分为“字段”集合。

      然后我们为每个输出文件指定要包含哪些字段。

      HTH!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-04
        • 2018-11-04
        • 1970-01-01
        • 2015-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-04
        相关资源
        最近更新 更多