分割 CSV 并保留标题而不包含中间文件

分割 CSV 并保留标题而不包含中间文件

我正在尝试将十几个 100MB 以上的 csv 文件拆分为可管理的较小文件以用于curl 帖子。

我已经成功做到了,但是有很多临时文件和 IO。这需要永恒的时间。

我希望有人能告诉我一种更有效地做到这一点的方法;最好是很少甚至没有磁盘 IO

#!/bin/sh

for csv in $(ls *.csv); do
    tail -n +2 $csv | split -a 5 -l - $RANDOM.split.
done

# chose a file randomly to fetch the header from   

header=$(ls *.csv |sort -R |tail -1 | cut -d',' -f1)

mkdir split

for x in $(/usr/bin/find . -maxdepth 1 -type f -name '*.split.*'); do
    echo Processing $x
    cat header $x >> split/$x
    rm -f $x
done

上面的脚本可能不完全有效。我基本上是通过这些命令的组合来实现它的。

我决定让curl POST 完全在上传失败的情况下再执行一步;如果全部发布,我不想丢失数据。但是,如果发生curl 错误,可以将数据放入重做文件夹中,那么这就可以工作。

#!/bin/sh

# working on a progress indicator as a percentage. Never finished.
count=$(ls -1 | wc -l 2> /dev/null | cut -d' ' -f1)

for file in $(/usr/bin/find . -maxdepth 1 -type f); do
    echo Processing $file
    curl -XPOST --data-binary @$file -H "Content-Type: text/cms+csv" $1
done

答案1

一种完全不同的方法是使用GNU并行,并使用它的--header--pipe选项:

cat input.csv | parallel --header : --pipe -N 10 'cat > output{#}.csv'

这将使每个文件中有 11 行(标题行加上 10 行-n 10,除了最后一个以这种方式编写的文件)。

相关内容