web-dev-qa-db-fra.com

Comment fractionner les fichiers CSV selon le nombre de lignes spécifié?

J'ai un fichier CSV (environ 10 000 lignes, chaque ligne comportant 300 colonnes) stocké sur le serveur LINUX. Je veux diviser ce fichier CSV en 500 fichiers CSV de 20 enregistrements chacun. (Chacun ayant le même en-tête CSV que celui présent dans le fichier CSV d'origine)

Existe-t-il une commande linux pour aider cette conversion?

70
Pawan Mude

Faites-en une fonction. Vous pouvez maintenant appeler 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
}

Trouvé sur: http://edmondscommerce.github.io/linux/linux-split-file-eg-csv-and-keep-header-row.html

69
Martin Dinov

Utilisez la commande Linux split:

split -l 20 file.txt new    

Divisez le fichier "fichier.txt" en fichiers commençant par "nouveau", chacun contenant 20 lignes de texte.

Tapez man split à l'invite Unix pour plus d'informations. Cependant, vous devrez d'abord supprimer l'en-tête de file.txt (à l'aide de la commande tail, par exemple), puis le rajouter à chacun des fichiers scindés.

116
James King

Cela devrait le faire pour vous - tous vos fichiers seront appelés 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

Cela devrait marcher !!!

file_name = Nom du fichier à fractionner.
10000 = Nombre de lignes que chaque fichier divisé contient
file_part_ = Préfixe du nom de fichier fractionné (file_part_0, file_part_1, file_part_2..etc continue)

split -d -l 10000 nom_fichier.csv partie_fichier

11
Coral