【问题标题】:Split large csv file and keep header in each part拆分大型 csv 文件并在每个部分中保留标题
【发布时间】:2016-09-20 01:17:42
【问题描述】:

如何拆分一个大的 csv 文件(~100GB)并保留每个部分的标题?

例如

h1 h2
a  aa
b  bb

进入

h1 h2
a  aa

h1 h2
b  bb

【问题讨论】:

标签: bash csv split


【解决方案1】:

首先你需要将标题和内容分开:

header=$(head -1 $file)
data=$(tail -n +2 $file)

那你要拆分数据

echo $data | split [options...] -

在选项中,您必须指定块的大小和生成文件名称的模式。尾随 - 不得删除,因为它指定 split 从标准输入读取数据。

然后你可以在每个文件的顶部插入标题

sed -i "1i$header" $splitOutputFile

您显然应该在 for 循环中执行最后一部分,但其确切代码将取决于为 split 操作选择的前缀。

【讨论】:

  • 不会data=$(tail -n +2 $file) 尝试将整个文件加载到内存中吗?
  • @NeilC.Obremski 我不能说实话。也许我会找时间测试一下,如果你先做,请给我你的反馈!
【解决方案2】:

我发现任何以前的解决方案都无法在我的脚本所针对的 mac 系统上正常工作(为什么是 Apple?为什么?)我最终得到了一个 printf 选项,它作为概念证明效果很好。我将通过将临时文件放入 ramdisk 等来增强这一点,以提高性能,因为它将一堆按原样放在磁盘上并且可能会很慢。

#!/bin/sh

# Pass a file in as the first argument on the command line (note, not secure)
file=$1

# Get the header file out
header=$(head -1 $file)

# Separate the data from the header
tail -n +2 $file > output.data

# Split the data into 1000 lines per file (change as you wish)
split -l 1000 output.data output

# Append the header back into each file from split 
for part in `ls -1 output*`
do
  printf "%s\n%s" "$header" "`cat $part`" > $part
done

【讨论】:

    【解决方案3】:

    您可以从here 下载免费软件 CsvSplitter。它是来自网站的 zip,其中包含一个简单的可移植 .exe 文件和一个 .txt 文件,与可执行文件一起使用是必需的,只需将内容提取到某个目录中即可开始工作:

    它可以拆分文件,如图所示

    一切都是不言自明的,但可以找到更多详细信息 here

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多