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?
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
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.
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
Cela devrait marcher !!!
file_name
= Nom du fichier à fractionner.10000
= Nombre de lignes que chaque fichier divisé contientfile_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