指定された行数に従ってCSVファイルを分割する方法は?


83

LINUXサーバーにCSVファイル(約10,000行、各行に300列)を保存しました。このCSVファイルをそれぞれ20レコードの500のCSVファイルに分割したいと思います。(それぞれが元のCSVに存在するものと同じCSVヘッダーを持っています)

この変換を支援するLinuxコマンドはありますか?


1
これは実際に機能しますが、最初のファイルのヘッダーが複製されるため、最初のcsvファイルに2つのヘッダーが与えられます。
rickman 2017年


回答:


79

関数にしました。今すぐ電話できます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


1
その仕組みを説明できますか?元の投稿を確認しましたが、説明もありませんし、コメントを投稿するオプションもありません。
shashi009 2016年

6
CSVのセルに改行が含まれている場合はどうなりますか?
オンドレイHlaváček

どんな改行文字ですか?UTF-8ではまだ機能しますが、これが役立つかどうかはわかりません。
owyongsk 2017年

3
@ shashi009:元のファイルの名前がfile.txtであると想定します。1:最初の行をスキップしてから、ファイルの残りの部分をにパイプしますsplit。これは、接頭辞split_2が付いた20行ごとに新しいファイルに分割されます。新しいsplit_ *ファイルを繰り返し処理し、各名前を変数fileに1つずつ格納します。3:それぞれについて... 4:元のファイルの最初の行(列ヘッダー)をtmp_file 5に書き込みます:20行の分割ファイルをtmp_file 6に追加します:古いsplit_ *ファイルを新しいtmp_fileで上書きして、列ヘッダーを保持します
David

1
ヘッダーの前にviaを付けることecho -e "$HEADER\n$(cat $i)" > $iは、不必要に不適切です。に置き換えましたsed -i -e "1i$HEADER" "$i"
フィリップメールス

146

Linuxのsplitコマンドを使用します。

split -l 20 file.txt new    

ファイル「file.txt」を「new」という名前で始まるファイルに分割します。各ファイルには、それぞれ20行のテキストが含まれています。

入力man splitの詳細については、UNIXプロンプトで。ただし、最初にfile.txtからヘッダーを削除してから(tailたとえば、コマンドを使用して)、分割された各ファイルにヘッダーを追加し直す必要があります。


file.txtの最初の(ヘッダー)行をスキップするにはどうすればよいですか?
フォークフォーク2017

を使用wc -lして行数を取得し、この値から1を引いて(wc -l50が得られたと仮定)、実行してtail -n 49(この例では)ヘッダー行を除くすべてを取得します。wc -l<newline>文字をカウントするため、最後の行が改行文字で終わらない場合は、行数が1つずれることに注意してください。
ルーカスロバーツ

4
@lucasは tail -n +2 、最初の行を除くすべての行を出力します。
ジェームズキング

@ JamesKing、+ 1&ありがとう!ドキュメントをもっと詳しく読む必要があります:)
Lucas Roberts

6
新しいファイル内の「.CSV」を保つためだけの追加--additional-suffix=.csv
Cocuba

21

これはうまくいくはずです!!!

file_name=分割するファイルの名前。
10000=各分割ファイルに含まれる行数
file_part_=分割ファイル名のプレフィックス(file_part_0、file_part_1、file_part_2..etcが続きます)

split -d -l 10000 file_name.csv file_part_


これは絶対にうまくいきます!作成する10000行ファイルの数を制限する方法はありますか?最初の200,000行を10k行のcsvファイルに分割し、残りを無視するとします。
PronomitaDey18年

1
@Pronomitahead -200000 file.csv | split -l 10000 - new_
boloyao

2
約69000 000行に破損した行がある13GbのCSVファイルがありました。bigqueryへのインポートがブロックされていました。これにより、行を分離して修正できるようになるまで、再帰的に分割することができました。サーバーを停止したりロックしたりせずに大きなファイルを処理するのにこれほど効率的なソリューションは他にありません。ファイルを5000 000行のチャンクに分割するのに約2分かかりました。ありがとう!
LPパピヨン

13

これでうまくいくはずです。すべてのファイルは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

これによりファイルが作成されましたが、タブ(つまり、\ t)はスペースに置き換えられ、CSVファイルは\ tを区切り文字として使用していました
AmineG 2015

これは、ファイルが自動的に連続して表示されるように番号を埋めることでわずかに改善できます。$ {n}を$(printf "%05d \ n" $ n)に置き換えることにより
Phineas Dashevsky 2016年

4
ヘッダー行が最初のファイルに複製されています。
ユハPalomäki

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.