Fusionner (concaténer) plusieurs fichiers CSV avec Terminal

ccciolll

Membre expert
Club iGen
Bonjour,

j'ai sous la main environ 2 000 fichiers txt avec tabulation (un genre de CSV mais avec une extension .txt, quoi).

J'ai cherché sur internet et ai trouvé une solution qui paraît vraiment simple avec la fonction cat du terminal

How to merge multiple CSV-files into one with Mac OS X Terminal.app

Mais le site est en anglais et je ne comprends pas comment il fait dans terminal pour lui dire OÙ agir.

J'ai essayé pls variantes, en clic-glissant le dossier dans terminal pour qu'il récupère son emplacement

Bloc de code:
new-host:~ MonNom$ /Users/MonNom/Desktop/txt cat *.txt > output.txt
-bash: /Users/MonNom/Desktop/txt: is a directory

new-host:~ MonNom$ cat /Users/MonNom/Desktop/txt/*.txt > output.txt

new-host:~ MonNom$ /Users/MonNom/Desktop/txt/*.txt cat > output.txt
-bash: /Users/MonNom/Desktop/txt/112725.txt: Permission denied

QUand j'ai vu access denied, j'ai tenté de modifier les droits sur mes fichiers txt pour les rendre en lecture seule à tous les utilisateurs (ils étaient effectivement interdit à tout utilisateur sauf moi). et relancer la commande…

Bloc de code:
new-host:~ MonNom$ /Users/MonNom/Desktop/txt/*.txt cat > routpute.txt
-bash: /Users/MonNom/Desktop/txt/112725.txt: Permission denied

… mais sans succès.
 
Salut ccciolll.

Ouvre le «Terminal», et à supposer que tes fichiers .txt soient tous contenus dans un seul dossier présent sur ton Bureau qui serait intitulé 'VALISE' (:D), tape d'abord la commande :

Bloc de code:
cd ~/Desktop/VALISE

et ↩︎ (retour-chariot : presser la touche 'Entrée' = 'Retour' du clavier pour activer la commande). cd (change directory) signifie que tu es désormais loggé dans l'espace du dossier 'VALISE' de ton Bureau et que tu n'as plus besoin d'indiquer des chemins à rallonges pour pointer les fichiers qui t'intéressent. Pour te faciliter la vie, commence simplement par taper :

Bloc de code:
cd

et saute un espace. Puis fais un glisser-déposer de ton dossier 'VALISE' (enfin le dossier quel qu'en soit le nom qui est sur ton Bureau et contient les .txt) dans la fenêtre du «Terminal» : le chemin jusqu'à la cible et la cible (=VALISE) s'inscrivent tous seuls. Veille seulement à ce que ce dernier syntagme soit séparé par un espace du verbe d'action inaugural : cd.

Maintenant que tu es loggé à pied d'œuvre, tape la commande :

Bloc de code:
cat ./*.txt >concaténé.txt

et ↩︎. Un fichier concaténé.txt constitué de la concaténation de tous tes fichiers .txt dans l'ordre de leur classement se trouve créé dans le dossier 'VALISE' (évidemment, tu choisis le nom que tu préfères. Tu peux remplacer concaténé.txt par ma_compil_préférée.txt. Si tu choisis un nom avec des mots séparés, mets le tout entre "", du style : "Le fichier à rallonges.txt". Fais surtout attention à bien respecter les espaces entre cat et ./*.txt, et entre ./*.txt et >concaténé.txt. Utilise le copier-coller sauf pour le nom du fichier de sortie.

Dans tes tentatives, tu commettais d'entrée l'erreur de ne pas invoquer le verbe d'action, qui se formule en abrégé d'un mot anglais, ici cat pour 'concatenate', plus diverses imprécisions dans les compléments d'objet du verbe.

[La commande que je t'ai proposée, c'est vraiment le basique de chez basique, sans aucune option. La concaténation brute - quoi. Terminaison en 'ute ' destinée à faire écho à l'intitulé projeté de ta dernière tentative = routpute.txt (sic) qui divertit fort mon esprit facétieux, prompt à imaginer le pragmatique output Anglais venir se muer sur le sol Français en quelque rout(e_à)pute de fréquentation périlleuse au regard d'une récente loi :D]
 
Dernière édition par un modérateur:
C'est mieux quand on comprend ce qu'on tape.

Dans ton "exemple" la bonne commande aurait été:
Bloc de code:
cat /Users/MonNom/Desktop/txt/*.txt > /Users/MonNom/Desktop/routpute.txt
(sortie de routput.txt sur le bureau)

Evidemment, il faut que chaque fichier se termine par un caractère retour charriot, sans quoi tu auras la premier ligne de chaque "fichier suivant" à la suite de la dernière du "fichier précédent".
 
2000 fichiers concaténés, surtout si comme edd le relève ils n'ont pas de saut de ligne terminal empêchant leur soudure en continu - cela risque de faire un texte aussi fluvial que celui du roman «Histoire» de Claude Simon...
 
Dernière édition par un modérateur:
  • J’aime
Réactions: bompi
Ne suffirait-il pas de créer un fichier texte ne contenant qu'un RC pour le concaténer systématiquement entre chaque.
 
Pour faire simple on peut faire aussi :
Bloc de code:
for i in "/Users/MonNom/Desktop/txt/*.txt"
do
cat "$i" >> /Users/MonNom/Desktop/routput.txt
echo "" >> /Users/MonNom/Desktop/routput.txt
done
On aura le (petit) problème inverse : avoir des lignes blanches en trop.

S'il y a des espaces dans les noms des fichiers texte, il faudra sans doute s'y prendre un peu autrement.
 
Bonjour,

je ne sais pas ce que j'avais bricolé mais j'avais loupé l'alerte que vous m'aviez répondu à cette question.
Comme c'était un vendredi soir et que le week end je participais à un évènement, autant dire que lundi j'avais complètement oublié ce souhait de concaténer des fichiers.
Et là, en ouvrant mon dossier "MaMaison", je tombe sur une armée de output.txt, outeput.txt, routpute.txt (eh oui, lui aussi).
Ben oui, il savaient atterri là.
Alors la plupart sont de 0k, mais il y en a un de 2,6 Mo, et comme mes originaux comportaient un retour chariot à la fin, pas de souci de trucs en une seule ligne, j'ai le résultat que j'attendais (je ne le savais même pas)
Donc, bon, je ne vais pas tester les méthodes que vous m'avez conseillées dans l'immédiat, mais merci tout de même.
Et du coup je vais pouvoir utiliser ce fichier concaténé comme je l'avais prévu.

---------- Nouveau message ajouté à 08h09 ---------- Le message précédent a été envoyé à 08h02 ----------

Euh,

sinon je viens aussi de me souvenir et de vérifier qu'on peut faire ça avec TextWrangler Edit > Insert > File Contents…