La fusion de plusieurs fichiers CSV en un seul à l'aide de PowerShell
Bonjour, je suis à la recherche d'un script powershell qui permettrait de fusionner tous les fichiers csv dans un répertoire dans un fichier texte (.txt) . Tous les fichiers csv avoir le même en-tête qui est toujours stocké dans une première ligne de chaque fichier. J'ai donc besoin de prendre de l'en-tête du premier fichier, mais dans le reste des fichiers de la première ligne doit être ignorée.
J'ai été en mesure de trouver des lots de fichiers qui est en train de faire exactement ce dont j'ai besoin, mais j'ai plus de 4000 fichiers csv dans un répertoire unique et il faut plus que 45 minutes pour faire le travail.
@echo off
ECHO Set working directory
cd /d %~dp0
Deleting existing combined file
del summary.txt
setlocal ENABLEDELAYEDEXPANSION
set cnt=1
for %%i in (*.csv) do (
if !cnt!==1 (
for /f "delims=" %%j in ('type "%%i"') do echo %%j >> summary.txt
) else (
for /f "skip=1 delims=" %%j in ('type "%%i"') do echo %%j >> summary.txt
)
set /a cnt+=1
)
Toute suggestion comment créer un script powershell qui serait plus efficace que de ce code de lot?
Merci.
Jean
OriginalL'auteur john50 | 2015-01-11
Vous devez vous connecter pour publier un commentaire.
Cela va ajouter tous les fichiers ensemble les lire une à une:
Celui-ci aura lieu une nouvelle ligne à la fin de chaque entrée du fichier si vous en avez besoin:
Sauter la première ligne:
un sec lemme de travail.
Merci beaucoup, excellent travail.
Content d'avoir pu aider!
OriginalL'auteur kemiller2002
Si vous êtes après un one-liner vous pouvez tuyau de chaque csv pour une
Import-Csv
, puis immédiatement à la pipe que pourExport-Csv
. Cela permettra de conserver la première ligne d'en-tête et d'exclure les autres fichiers d'en-tête de lignes. Il permettra également de traiter chaque csv un à la fois, plutôt que de se charger de tous en mémoire, puis de les jeter dans votre fusionné csv.Je suis d'accord, la meilleure réponse.
Est-il un moyen pour que cela fonctionne avec PowerShell version 2? C'est la seule version que j'ai, et elle ne comprend pas l'option Ajouter à l'Exportation au format Csv
C'est certainement la solution la plus simple à condition que tous les fichiers CSV ont le même ensemble de colonnes dans le même ordre. Si les fichiers source ont différentes colonnes (ou de commande) et que vous voulez un sur-ensemble du fichier, vous aurez besoin de tuyau de l'Import-Csv de sortie dans un Système.Les données.DataTable, l'ajout de colonnes que vous allez, et le tuyau de la finale de la DataTable à l'Exportation au format Csv.
OriginalL'auteur stinkyfriend
Votre fichier de commandes est assez inefficace! Essayez celui-ci (vous allez être surpris 🙂
Comment ce est une amélioration
for /f ... in ('type "%%i"')
nécessite de charger et d'exécuter cmd.exe pour l'exécution de la commande type, la capture de sa sortie dans un fichier temporaire, puis lire les données à partir d'elle, et cela se fait avec chaque fichier d'entrée.for /f ... in ("%%i")
lire directement les données à partir du fichier.>>
redirection ouvre le fichier, ajoute des données à la fin et ferme le fichier, et c'est fait avec chaque sortie **. Le>
redirection conserve le fichier est ouvert tout le temps.Aacini du élimine le besoin d'une variable de compteur et vérifier la logique de fonctionnement, de donner le script de moins en moins de choses à faire à l'intérieur de la boucle, le rendant plus rapide.
Je vous remercie pour votre aide, mais pour quelque raison il ne fonctionne pas.L'erreur est: "la Suppression n'est pas reconnu en tant que commande interne ou externe, un programme exécutable ou un fichier de commandes. Je suppose qu'il devrait y avoir de l'ÉCHO de commande avant de "Suppression de fichier combiné". Mais ça ne fonctionne pas même après que je l'ai corrigé. Il y a juste un couple de caractères dans le fichier de synthèse.
Les deux principales différences sont les suivantes: 1.
for /f ... in ('type "%%i"')
nécessite de charger et d'exécuter cmd.exe afin d'exécuter lestype
de commande, la capture de sa sortie dans un fichier temporaire, puis lire les données à partir d'elle, et c'est fait avec chaque fichier d'entrée.for /f ... in ("%%i")
de lire directement les données à partir du fichier. 2. Le>>
redirection ouvrir le fichier, ajouter des données à la fin et fermez le fichier, et c'est fait à chaque sortie **. Le>
redirection conserve le fichier est ouvert tout le temps.OriginalL'auteur Aacini
C'est assez trivial dans PowerShell.
Seul inconvénient de cette approche est qu'elle ne l'analyser tous les fichiers. Il charge également tous les fichiers dans la mémoire, donc, si nous parlons de 4000 fichiers de 100 MO chacun, vous aurez évidemment des problèmes.
Vous pourriez obtenir de meilleures performances avec
System.IO.File
etSystem.IO.StreamWriter
.OriginalL'auteur Bacon Bits
J'ai trouvé les solutions précédentes tout à fait inefficace pour les grandes csv fichiers en termes de performances, voici donc une performant alternative.
Voici une alternative qui ajoute simplement les fichiers:
Par la suite, vous voudrez probablement de se débarrasser des multiples csv en-têtes.
OriginalL'auteur davidhigh
OriginalL'auteur Randall Spies
Ici est une version aussi à l'aide de Système.IO.Fichier,
Juste édité le code à insérer un "Saut de ligne" après chaque csv ligne.
Je vous remercie beaucoup. Maintenant, il fonctionne bien, mais c'est plus de 2 fois plus lent que le Kevin du code. Sauf si quelqu'un a plus de quelques centaines de fichiers dans un répertoire, il ne devrait pas. Je vous remercie encore.
Je vois, et je peux voir pourquoi, j'ai écrit chaque ligne séparément. Si vous avez le temps, essayez ce code... (réédité)
Mon sentiment profond est que l'appel .NET directement devrait être plus rapide que le “Get-content”/“Ajouter du Contenu”, mais je suppose qu'il ne l'est pas. Après avoir tester les deux versions avec un échantillon de 500 fichiers CSV, “Get-content”/“Ajouter un Contenu” qui l'emporte haut la main. Ce [Système.IO.Fichier] version: Temps Écoulé: 2.254 secondes de Kevin (“Get-content”/“Ajouter un Contenu”) version Temps Écoulé: 1.741 secondes
OriginalL'auteur Jan Chrbolka
Le lot suivant de script est très rapide. Cela doit fonctionner aussi longtemps qu'aucun de vos fichiers CSV contiennent des caractères de tabulation, et toutes les sources des fichiers CSV ont moins de 64 ko lignes.
La raison de ces restrictions, qui PLUS est, convertit les pattes dans une série d'espaces, et la redirection des PLUS se bloque à 64 ko lignes.
OriginalL'auteur dbenham
OriginalL'auteur Dan Arseneau
Essayer cela, il a travaillé pour moi
OriginalL'auteur Anki
de type *.csv >> dossier\combinés.csv
OriginalL'auteur Kent