カールポスト用に、12個の100MB以上のcsvファイルを管理可能な小さなファイルに分割しようとしています。
私はなんとかそれを行うことができましたが、多くの一時ファイルと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データをREDOフォルダーに入れると、それが機能します。
#!/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
まったく異なるアプローチは、 GNU parallel を使用し、その--header
および--pipe
オプションを使用することです。
cat input.csv | parallel --header : --pipe -N 10 'cat > output{#}.csv'
これにより、各ファイルに11行が表示されます(ヘッダー行と-n 10
からの10行(そのように記述された最後のファイルを除く))。