36 votes

Fusionner plusieurs fichiers CSV sans fusionner l'en-tête

J'ai besoin de fusionner plusieurs fichiers .CSV (à l'aide de l'outil de gestion de l'information). cat ) mais sans copier l'en-tête de chaque fichier.

Quelle est la meilleure façon d'accomplir cette tâche ?

45voto

iolsmit Points 4325

Vous aurez besoin de plus que le cat comme décrit ici :

Disons que vous avez 3 fichiers CSV : file1.csv , file2.csv et file3.csv et veulent les rejoindre pour bigfile.csv et que votre en-tête est toujours (uniquement) la première ligne, alors utilisez

soit (garder l'en-tête du premier fichier "file1.csv") :

cat file1.csv <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv

ou (supprimer l'en-tête de tous les fichiers dont le nom commence par "file") :

awk 'FNR > 1' file*.csv > bigfile.csv

4 votes

J'ai trouvé ceci en cherchant une réponse générique pour Linux, mais dans mon cas, cela n'a pas vraiment fonctionné. Il ignorait silencieusement file1.csv. J'avais besoin d'attraper ce fichier. cat <(cat file1.csv) <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv

0 votes

En fait, j'ai dû utiliser tail -n+2 , tail +2 ne fonctionne pas

35voto

Marek Grác Points 381

Je suis d'accord avec la première réponse mais je suggère de l'étendre avec le scénario suivant (car je ne peux pas faire de commentaires) :

Si vous voulez que le fichier de sortie contienne un en-tête (une fois), le script correct est :

awk '(NR == 1) || (FNR > 1)' file*.csv > bigfile.csv

FNR représente le numéro de l'enregistrement traité dans un seul fichier. Et NR le représente globalement, donc la première ligne est acceptée et le reste est ignoré comme avant.

0 votes

Je reviens à cette réponse chaque fois que je rencontre une fusion de fichiers CSV en ligne de commande, nécessitant de conserver l'en-tête d'un seul fichier.

9voto

Vous pouvez également utiliser une commande de groupe ( { ; } ) au lieu de la substitution de processus ( <() ) :

{ head -n1 file1.csv; for f in file*.csv; do tail -n+2 "$f"; done; } > new.csv

Il fonctionne également avec les fins de ligne CRLF tant que les fichiers se terminent par une ligne vide ( \r\n ).

Les versions numérotées de head et tail ont été rendues obsolètes par POSIX 1003.1-2001, et elles entraînent des avertissements dans certains environnements.

2voto

mcconnelljk Points 21

Nécessité de concaténer deux grands CSV avec des colonnes identiques dans un plus grand CSV pour le chunking script (les données n'ont pas d'identifiants uniques).

Le premier a retiré l'en-tête du second csv.

awk 'FNR > 1' file2.csv > file2_noheading.csv

Ensuite, concaténation par le biais de ce qui suit

cat file1.csv file2_noheading.csv > newfile.csv

1voto

hd1 Points 111

En utilisant la séquence de commandes ci-dessus, on obtient un fichier ressemblant à ceci :

header,of,csv1
contents,of,csv1
==> csv2.csv

contents,of,csv2

Pour en faire un vrai CSV, avec une ligne d'en-tête et toutes les valeurs pertinentes, j'ai employé ce qui suit sed incantation... sed -ie "/^$/d;/^==>/d" bigfile.csv

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X