web-dev-qa-db-ja.com

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

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

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

70
Pawan Mude

関数にしました。 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
        echo -e "$HEADER\n$(cat $i)" > $i
    done
}

発見: http://edmondscommerce.github.io/linux/linux-split-file-eg-csv-and-keep-header-row.html

69
Martin Dinov

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

split -l 20 file.txt new    

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

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

116
James King

これはあなたのためにそれを行う必要があります-すべてのファイルは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
13
Mark Setchell

これは動作するはずです!!!

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

split -d -l 10000 file_name.csv file_part_

11
Coral