131 votes

Concaténation de fichiers texte avec la ligne de commande Windows, en supprimant les lignes de tête

Je dois concaténer des fichiers texte relativement volumineux, et je préférerais le faire via la ligne de commande. Malheureusement, je n'ai que Windows, et je ne peux pas installer de nouveaux logiciels.

type file1.txt file2.txt > out.txt

me permet d'obtenir presque ce que je veux, mais je ne veux pas que la 1ère ligne de file2.txt soit incluse dans out.txt.

J'ai remarqué que more a le +n pour spécifier une ligne de départ, mais je n'ai pas réussi à les combiner pour obtenir le résultat que je souhaite. Je suis conscient que ce n'est peut-être pas possible sous Windows, et je peux toujours éditer out.txt à la main pour me débarrasser de la ligne, mais existe-t-il un moyen simple de le faire à partir de la ligne de commande ?

139voto

ghostdog74 Points 86060
more +2 file2.txt > temp
type temp file1.txt > out.txt

ou vous pouvez utiliser copy . Voir copy /? pour plus.

copy /b temp+file1.txt  out.txt

4 votes

Bien sûr ! J'aurais cependant préféré éviter l'utilisation de fichiers temporaires. J'ai essayé d'utiliser des parenthèses, des pipes et des < pour tout regrouper en une seule commande, mais je n'ai rien pu faire. Le site copy est beaucoup plus rapide, mais elle place un caractère SUB à la fin. Existe-t-il un moyen d'éviter cela ?

20 votes

J'ajouterais que si vous voulez concaténer TOUS les fichiers, vous pouvez faire copy /b *.txt combined.txt sans avoir à lister les fichiers individuellement.

1 votes

Plus apparemment convertir les tabulations en espaces, dommage !

63voto

Raj More Points 22358

J'utilise ceci, et ça marche bien pour moi :

TYPE \\Server\Share\Folder\*.csv >> C:\Folder\ConcatenatedFile.csv

Bien sûr, avant chaque course, vous devez DELETE C:\Folder\ConcatenatedFile.csv

Le seul problème est que si tous les fichiers ont des en-têtes, ils seront répétés dans tous les fichiers.

2 votes

Lorsque j'entre un nom de fichier pour le fichier concaténé, ce qui signifie qu'il est listé à la fin des fichiers dans la loaction (ordre alphabétique), alors Windows semble concaténer deux fois ! J'ai fini par utiliser un nom de fichier de 1filename.csv pour ne pas avoir ce problème. Je suppose que la concaténation dans un dossier différent devrait également fonctionner...

1 votes

Si vous utilisez > au lieu de >>, vous n'avez pas besoin de supprimer le fichier au préalable. > redirige la sortie et crée un nouveau fichier à chaque fois. >> redirige la sortie et ajoute le fichier.

1 votes

Comment cela permet-il de sauter la première ligne du fichier 2, ce que le PO a demandé ?

23voto

John Faughnan Points 106

Je ne dispose pas d'assez de points de réputation pour commenter la recommandation d'utiliser *.csv >> ConcatenatedFile.csv mais je peux ajouter un avertissement :

Si vous créez ConcatenatedFile.csv dans le même répertoire que celui que vous utilisez pour la concaténation, il sera ajouté à lui-même.

2 votes

Comment cela permet-il de sauter la première ligne du fichier 2, ce que le PO a demandé ?

6voto

Alberto Rossini Points 109

Utilisez la commande FOR pour faire écho à un fichier ligne par ligne, et avec l'option 'skip' pour sauter un certain nombre de lignes de départ...

FOR /F "skip=1" %i in (file2.txt) do @echo %i

Vous pourriez rediriger la sortie d'un fichier batch, contenant quelque chose comme...

FOR /F %%i in (file1.txt) do @echo %%i
FOR /F "skip=1" %%i in (file2.txt) do @echo %%i

Notez le double % lorsqu'une variable FOR est utilisée dans un fichier batch.

2voto

Andrew Mao Points 10616

Je sais que vous avez dit que vous ne pouviez pas installer de logiciel, mais je ne suis pas sûr que cette restriction soit aussi stricte. Quoi qu'il en soit, j'ai eu le même problème (essayer de concaténer deux fichiers avec vraisemblablement les mêmes en-têtes) et j'ai pensé fournir une réponse alternative pour les autres qui arrivent sur cette page, puisque cela a très bien fonctionné pour moi.

Après avoir essayé tout un tas de commandes sous Windows et avoir été sévèrement frustré, et aussi avoir essayé toutes sortes d'éditeurs graphiques qui promettaient de pouvoir ouvrir de gros fichiers, mais qui ne le pouvaient pas, je suis finalement revenu à mes racines Linux et j'ai ouvert mon invite Cygwin. Deux commandes :

cp file1.csv out.csv
tail -n+2 file2.csv >> out.csv

Para file1.csv 800MB et file2.csv 400MB, ces deux commandes ont pris moins de 5 secondes sur ma machine. Dans une invite Cygwin, pas moins. Je pensais que les commandes Linux étaient censées être lentes dans Cygwin, mais cette approche a demandé beaucoup moins d'efforts et était bien plus facile que toutes les approches Windows que j'ai pu trouver.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X