CSVを分割し、中間ファイルなしでヘッダーを保持します。

CSVを分割し、中間ファイルなしでヘッダーを保持します。

カール投稿のために、100 MB以上のcsvファイルを12個の管理可能な小さなファイルに分割しようとしています。

これはうまくいきましたが、一時ファイルと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

上記のスクリプトは完全に無効である可能性があります。基本的に、これらのコマンドを組み合わせて達成しました。

アップロードが失敗した場合は、カールPOSTをさらに1段階実行することにしました。すべてが公開されても、データが失われたくありませんでした。ただし、カールエラーが発生した場合は、データをredフォルダに入れると機能します。

#!/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'

-n 10これにより、各ファイルに11行が残ります(このようにして作成された最後のファイルを除いて、ヘッダー行に10行を追加します)。

おすすめ記事