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 nouveau logiciel.
type file1.txt file2.txt > out.txt
me permet presque d'obtenir 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 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 souhaité. Je suis conscient que cela peut ne pas être possible sous Windows, et je peux toujours éditer out.txt à la main pour supprimer la ligne, mais existe-t-il un moyen simple de le faire depuis la ligne de commande?
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
J'utilise ceci et ça marche bien pour moi:
TYPE \\Server\Share\Folder\*.csv >> C:\Folder\ConcatenatedFile.csv
Bien sûr, avant chaque exécution, vous devez DELETE C:\Folder\ConcatenatedFile.csv
Le seul problème est que si tous les fichiers ont des en-têtes, cela sera répété dans tous les fichiers.
Je n'ai pas 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 un fichier ConcatenatedFile.csv
dans le même répertoire que celui que vous utilisez pour la concaténation, il sera ajouté à lui-même.
Utilisez la commande FOR pour afficher un fichier ligne par ligne et avec l'option "ignorer" pour manquer plusieurs lignes de départ ...
FOR /F "skip=1" %i in (file2.txt) do @echo %i
Vous pouvez rediriger la sortie d'un fichier de commandes 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 de traitement par lots.
Je mettrais cela dans un commentaire à ghostdog74, sauf que mon représentant est trop bas, alors allez-y .more +2 file2.txt > temp
Ce code ignorera les lignes 1 et 2 du fichier. OP veut conserver toutes les lignes du premier fichier (pour conserver la ligne d'en-tête), puis exclure la première ligne (probablement la même ligne d'en-tête) du deuxième fichier. Par conséquent, pour exclure uniquement la ligne d'en-tête, OP devrait utiliser more +1
.
type temp file1.txt > out.txt
On ne sait pas quel ordre résulte de ce code. Est-ce que temp
est ajouté à file1.txt
(comme vous le souhaitez) ou file1.txt
est ajouté à temp
(non souhaité car la ligne d'en-tête serait enterrée au milieu du fichier résultant) .
En outre, ces opérations prennent très longtemps avec des fichiers volumineux (par exemple 300 Mo)
Voici comment faire ceci:
(type file1.txt && more +1 file2.txt) > out.txt
Je sais que vous avez dit que vous ne pouviez installer aucun logiciel, mais je ne suis pas certain de la sévérité de cette restriction. Quoi qu'il en soit, j'avais le même problème (essayer de concaténer deux fichiers avec probablement les mêmes en-têtes) et je pensais pouvoir fournir une réponse alternative aux autres utilisateurs de cette page, car cela fonctionnait parfaitement pour moi.
Après avoir essayé un tas de commandes dans Windows et été gravement frustré, ainsi que toutes sortes d'éditeurs graphiques qui promettaient d'ouvrir des fichiers volumineux, mais qui ne le pouvaient pas, j'ai finalement retrouvé mes racines Linux et ouvert Cygwin. Rapide. Deux commandes:
cp file1.csv out.csv
tail -n+2 file2.csv >> out.csv
Pour file1.csv
800 Mo et file2.csv
400 Mo, ces deux commandes ont pris moins de 5 secondes sur ma machine. Dans l'invite de Cygwin, pas moins. Je pensais que les commandes Linux étaient censées être lentes sous Cygwin, mais cette approche demandait beaucoup moins d'effort et était bien plus simple que n'importe quelle approche Windows que je pouvais trouver.
En PowerShell:
Get-Content file1.txt | Out-File out.txt
Get-Content file2.txt | Select-Object -Skip 1 | Out-File -Append out.txt
Vous pouvez aussi simplement essayer ceci
type file2.txt >> file1.txt
Il ajoutera le contenu de file2.txt à la fin de file1.txt
Si vous avez besoin du fichier original 1.txt, effectuez une sauvegarde au préalable. Ou tu peux faire ça
type file1.txt > out.txt
type file2.txt >> out.txt
Si vous souhaitez un saut de ligne à la fin du premier fichier, vous pouvez essayer la commande suivante avant l'ajout.
type file1.txt > out.txt
printf "\n" >> out.txt
type file2.txt >> out.txt
L'aide de copy
explique que les caractères génériques peuvent être utilisés pour concaténer plusieurs fichiers en un.
Par exemple, pour copier tous les fichiers .txt du dossier en cours commençant par "abc" dans un seul fichier nommé xyz.txt:
copy abc*.txt xyz.txt