LINUXサーバーにCSVファイル(約10,000行、各行に300列)を保存しました。このCSVファイルをそれぞれ20レコードの500のCSVファイルに分割したいと思います。(それぞれが元のCSVに存在するものと同じCSVヘッダーを持っています)
この変換を支援するLinuxコマンドはありますか?
LINUXサーバーにCSVファイル(約10,000行、各行に300列)を保存しました。このCSVファイルをそれぞれ20レコードの500のCSVファイルに分割したいと思います。(それぞれが元のCSVに存在するものと同じCSVヘッダーを持っています)
この変換を支援するLinuxコマンドはありますか?
回答:
関数にしました。今すぐ電話できますsplitCsv <Filename> [chunkSize]
splitCsv() {
HEADER=$(head -1 $1)
if [ -n "$2" ]; then
CHUNK=$2
else
CHUNK=1000
fi
tail -n +2 $1 | split -l $CHUNK - $1_split_
for i in $1_split_*; do
sed -i -e "1i$HEADER" "$i"
done
}
見つかった場所:http://edmondscommerce.github.io/linux/linux-split-file-eg-csv-and-keep-header-row.html
split
。これは、接頭辞split_
2が付いた20行ごとに新しいファイルに分割されます。新しいsplit_ *ファイルを繰り返し処理し、各名前を変数file
に1つずつ格納します。3:それぞれについて... 4:元のファイルの最初の行(列ヘッダー)をtmp_file
5に書き込みます:20行の分割ファイルをtmp_file
6に追加します:古いsplit_ *ファイルを新しいtmp_file
で上書きして、列ヘッダーを保持します
echo -e "$HEADER\n$(cat $i)" > $i
は、不必要に不適切です。に置き換えましたsed -i -e "1i$HEADER" "$i"
。
Linuxのsplitコマンドを使用します。
split -l 20 file.txt new
ファイル「file.txt」を「new」という名前で始まるファイルに分割します。各ファイルには、それぞれ20行のテキストが含まれています。
入力man split
の詳細については、UNIXプロンプトで。ただし、最初にfile.txtからヘッダーを削除してから(tail
たとえば、コマンドを使用して)、分割された各ファイルにヘッダーを追加し直す必要があります。
wc -l
して行数を取得し、この値から1を引いて(wc -l
50が得られたと仮定)、実行してtail -n 49
(この例では)ヘッダー行を除くすべてを取得します。wc -l
<newline>文字をカウントするため、最後の行が改行文字で終わらない場合は、行数が1つずれることに注意してください。
tail -n +2
、最初の行を除くすべての行を出力します。
--additional-suffix=.csv
これはうまくいくはずです!!!
file_name
=分割するファイルの名前。
10000
=各分割ファイルに含まれる行数
file_part_
=分割ファイル名のプレフィックス(file_part_0、file_part_1、file_part_2..etcが続きます)
split -d -l 10000 file_name.csv file_part_
head -200000 file.csv | split -l 10000 - new_
これでうまくいくはずです。すべてのファイルはPart1-Part500と呼ばれることになります。
#!/bin/bash
FILENAME=10000.csv
HDR=$(head -1 $FILENAME) # Pick up CSV header line to apply to each file
split -l 20 $FILENAME xyz # Split the file into chunks of 20 lines each
n=1
for f in xyz* # Go through all newly created chunks
do
echo $HDR > Part${n} # Write out header to new file called "Part(n)"
cat $f >> Part${n} # Add in the 20 lines from the "split" command
rm $f # Remove temporary file
((n++)) # Increment name of output part
done
ワンライナーの答えがあります(この例では、999行のデータとファイルごとに1つのヘッダー行があります)
cat bigFile.csv | parallel --header : --pipe -N999 'cat >file_{#}.csv'