Je vous présente aujourd'hui un petit script batch que j'ai écris il y a de ça quelques années.
Cette moulinette (script) permet de fusionner plusieurs fichiers CSV ensemble en ne gardant qu'une seule ligne d'en-têtes.
Moulinette
Et oui c'est son nom, la moulinette !
Alors bien sûr il faut que tous vos fichiers CSV aient la même ligne d'en-têtes (même ordre, même nombre, même contenu) :
Il suffit de déposer vos fichiers CSV dans le répertoire CSV_ENTREE et de lancer fusionner.bat
Vous récupèrerez dans le répertoire "SORTIE" le fichier combined.csv contenant toutes les données de vos CSV mais avec une seule ligne d'en-tête.
Attention : chaque lancement du script écrase le précédent fichier de sortie combined.csv
Si vous souhaitez traiter uniquement des fichiers ayant un préfixe particulier il faut remplacer cette ligne :
for %%i in ("CSV_ENTREE\*.csv") do (
par :
for %%i in ("CSV_ENTREE\prefixe*.csv") do (
Ne renommez évidemment aucun des 2 dossiers , sinon le script ne fonctionnera pas.
Conclusion
Que dire de plus ? ah si ! J'ai fait en sorte que le script fonctionne directement depuis sur un partage de fichier SMB (CIFS), que ce soit un chemin UNC "\\serveur\partage" ou une lettre de lecteur réseau mappée.
Faites-en bon usage et signalez-vous en commentaire si ce script vous a été utile 🙂
Auteur : Mr Xhark
Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter
14 commentaires
Extraordinaire !!! Je suis étonné que personne ait laissé un commentaire !!
Un tout grand super merci !! Cela faisait une éternité que je recherchais comment faire. Encore un immense merci !! Bonne continuation ...
@JustToTest: et bien merci à toi, ça fait plaisir de voir que ça sert 🙂
Bonjour Mr Xhark
Super outil !
est-il possible d'inclure le nom du fichier sur chaque ligne cela permet de savoir à quel fichier appartient chaque ligne
Encore merci à vous
@julie: Hello Julie, merci 🙂 oui c'est possible en ajoutant ceci avant la ligne 35 :
Bonjour,
Ce script est juste... merveilleux ! exactement ce dont j'avais besoins !!!
Juste une question, dans mes fichiers csv, il y a des dates, et malheureusement il prends en premier le fichier qui devrait être en dernier, je m'explique, le premier fichier s'appelle
1-nnnnn_2019.csv et le second nnnnn_2020.csv et malgrès le 1 devant, il est pris en second... pourquoi ? (je ne serais pas forcément limité à 2 fichiers 🙂
en tout cas MERCI, c'est génial
Olivier
@Olivemann: Hello! alors je n'ai pas réussi à reproduire ton souci, chez moi le fichier avec "1" est traité avant.
Mais voici une piste, remplace la ligne 31 :
Par :
Bonjour
Ca marche nickel !
1/ J'aurais besoin de rajouter une date au début du nom du fichier de sortie
2/ Le script rajoute un blanc à la fin de chaque ligne et une ligne vide à la fin du fichier est ce qu'il y a un moyen de l'éviter ?
Encore merci pour le partage 😉
Jacques
@Mr Xhark:
Bonjour Xhark,
C'est vraiment un super script rapide et qui fait parfaitement le travail. J'ai passé des heures à chercher à faire cela.
Par contre, comme Julie, je souhaite ajouter une colonne qui donne le nom du fichier d'origine de la ligne (sans le .csv) afin de savoir de quel fichier csv provient chaque ligne. Mais malgré la réponse donnée, je n'arrive pas à réaliser l'opération. Peux tu m'aider?
J'ai mis cela comme ceci (ligne 31 ;35 et 36)
34. REM Ecriture du fichier complet avec l'entete dans combined.csv (le fichier sera cree)
35. echo * Traitement de: %%i >> !SORTIE!
36 for /f "delims=" %%j in ('type "%%i"') do echo %%j >> !SORTIE!
Merci beaucoup.
Olivier
Rebonjour,
J'ai réussi à faire fonctionner la commande
echo * Traitement de: %%i >> !SORTIE!
Mais ce n'est pas exactement l'attendu; l'idée serai d'avoir une nouvelle colonne dans le csv final qui répète autant de fois que nécessaire le nom du fichier d'origine.
exemple :
fichier1.csv
nom;prénom
A;A1
B;B1
C;C1
fichier2.csv
nom;prénom
D;D1
E;E1
F;F1
fichier de sortie :
combined.csv
nom;prénom;fichier
A;A1;fichier1
B;B1;fichier1
C;C1;fichier1
D;D1;fichier2
E;E1;fichier2
F;F1;fichier2
Merci
@olivier: Il ne sera pas possible de le faire de la façon dont je l'ai fait, car j'envoie le contenu du fichier au lieu de le parcourir ligne par ligne.
Mais voici une alternative (source)
Avant tout se déplacer dans CSV_ENTREE puis :
Le findstr permet d'ignorer les lignes qui commencent par "#"
je te laisse tester 😉
Bonjour,
merci beaucoup pour ce batch très utile !
Une question :
serait-il possible de faire la même chose avec des fichiers .ods vers un fichier csv ?
@Lisa.mlnr: oui :
https://stackoverflow.com/questions/64589140/convert-ods-to-csv-using-command-line-when-libreoffice-instance-is-running
https://forum.openoffice.org/fr/forum/viewtopic.php?f=8&t=54122
Bonjour, super script que je cherchais depuis pas mal de temps.
Très bien commenté dans les instructions pour apprendre.
Merciiiiiiiiiiiiii ++++++++
@Olive: merci pour ton retour!