2010-03-19 7 views
105

J'ai besoin de 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.Concaténer des fichiers texte avec une ligne de commande Windows, en supprimant les lignes principales

type file1.txt file2.txt > out.txt 

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

J'ai remarqué que more a l'option +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 veux. Je suis conscient que cela peut ne pas être possible dans Windows, et je peux toujours éditer out.txt à la main pour se débarrasser de la ligne, mais y a-t-il un moyen simple de le faire à partir de la ligne de commande?

Répondre

118
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 
+1

Bien sûr! J'aurais préféré éviter l'utilisation de fichiers temporaires. J'ai essayé d'utiliser des parenthèses, des tuyaux et James

+10

oui, vous mettez '/ b'. voir edit – ghostdog74

+7

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. – Phlucious

6

Utilisez la commande FOR pour faire écho une ligne de fichiers en ligne, et avec l'option « sauter » de manquer un certain nombre de lignes de départ ...

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

Vous pouvez 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 la double% lorsqu'une FOR variable est utilisée dans un fichier batch.

2

Je sais que vous avez dit que vous ne pouviez pas installer de logiciel, mais je ne suis pas sûr de la précision de cette restriction. Quoi qu'il en soit, j'ai eu le même problème (en essayant 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, car cela a fonctionné très bien pour moi. Après avoir essayé toute une série de commandes dans Windows et être très frustré, et essayé toutes sortes d'éditeurs graphiques qui promettaient d'ouvrir de gros fichiers, mais je ne pouvais pas, je suis finalement revenu à mes racines Linux. et ouvert mon invite Cygwin. Deux commandes:

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

Pour file1.csv 800MB et 400MB file2.csv, ces deux commandes ont 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 nécessitait beaucoup moins d'efforts et était beaucoup plus simple que n'importe quelle approche Windows que je pouvais trouver.

55

-je utiliser cela, et il fonctionne 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 en-têtes, alors il sera répété dans tous les fichiers.

+1

Lorsque je saisis 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), windows semble concaténer deux fois! J'ai fini par utiliser un nom de fichier de 1filename.csv pour ne pas avoir le problème. Je suppose que la concaténation dans un dossier différent devrait également fonctionner ... – SebK

+0

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

+0

Comment cela ignore-t-il la première ligne du fichier 2, sur laquelle l'OP a posé une question? –

20

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

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

+1

Comment cela ignore-t-il la première ligne du fichier 2, sur laquelle l'OP a posé une question? –

2

Je mettrais cela dans un commentaire à ghostdog74, sauf que mon représentant est trop faible, alors voilà.

more +2 file2.txt > temp
Ce code ne tient pas compte en fait les lignes 1 et 2 du fichier. OP souhaite conserver toutes les lignes du premier fichier (pour conserver la ligne d'en-tête), puis exclure la première ligne (vraisemblablement la même ligne d'en-tête) du second fichier, afin d'exclure uniquement la ligne d'en-tête OP more +1.

type temp file1.txt > out.txt

On ne sait pas dans quel ordre les résultats de ce code. Est temp ajouté à file1.txt (comme vous le souhaitez), ou file1.txt est ajouté à temp (indésirable car la ligne d'en-tête serait enterrée au milieu du fichier résultant).

En outre, ces opérations prennent vraiment beaucoup de temps avec de gros fichiers (par exemple 300MB)

-2
more +2 file1.txt > type > out.txt && type file2.txt > out.txt 
0

Voici comment faire:

(type file1.txt && more +1 file2.txt) > out.txt 
Questions connexes