Comment utiliser powershell pour réorganiser les colonnes CSV
Fichier d'entrée:
column1;column2;column3
data1a;data2a;data3a
data1b;data2b;data3b
But: le fichier de sortie avec la réorganisation des colonnes, dire
column1;column3;column2
...
Mis à JOUR Question:
Quelle est la bonne façon de l'utilisation de powershell pour résoudre ce problème.
Je suis conscient de l'existence de CSV applets de commande, mais elles ont des limites.
Notez que l'ordre des enregistrements n'a pas besoin d'être modifié, afin de chargement de l'ensemble de l'entrée/sortie de fichier dans la mémoire ne devrait pas être nécessaire.
source d'informationauteur Bernard Vander Beken
Vous devez vous connecter pour publier un commentaire.
Ici est la solution adaptée pour des millions d'enregistrements (en supposant que vos données n'ont pas intégré ';')
C'est formidable que les gens sont venus avec leurs solutions basées sur l'état pur .NET. Cependant, je me battrais pour la simplicité, si possible. C'est pourquoi je upvoted vous tous 😉
Pourquoi? J'ai essayé de générer 1 000 000 d'enregistrements et de les stocker dans CSV et puis réorganiser les colonnes.
Générer le fichier csv a été dans mon cas, beaucoup plus exigeant, puis la réorganisation. Regardez les résultats.
Il a fallu seulement 1,8 minute pour réorganiser les colonnes. Pour moi c'est assez décent résultat. Est-il ok pour moi? -> Oui, je n'ai pas besoin d'essayer de trouver la solution plus rapide, c'est assez bon -> sauvé mon temps pour d'autres choses intéressantes 😉
Modifier: analyse comparative info ci-dessous.
Je ne voudrais pas utiliser le Powershell csv applets de commande. Je voudrais utiliser
System.IO.StreamReader
ouMicrosoft.VisualBasic.FileIO.TextFieldParser
pour la lecture dans le fichier ligne par ligne, pour éviter de charger la totalité de la chose en mémoire, et je voudrais utiliserSystem.IO.StreamWriter
pour l'écrire. LeTextFieldParser
utilise en interne uneStreamReader
mais les poignées de l'analyse les champs sont délimités de sorte que vous n'avez pas à, ce qui rend très utile si le format CSV n'est pas simple (par exemple, a des caractères délimiteurs dans la cité des champs).Je voudrais également de ne pas le faire en Powershell, mais plutôt dans une .NET application, comme il le sera beaucoup plus rapide qu'un script Powershell même s'ils utilisent les mêmes objets.
Ici C# pour une version simple, en supposant qu'aucune cité des champs et le codage ASCII:
Voici le Powershell version:
Je comparés de ces deux contre un 3-colonne du fichier csv avec 10 000 000 de lignes. La version C# a pris 171.132 secondes (un peu moins de 3 minutes). Le Powershell version a pris 2 364 personnes.995 secondes (39 minutes et 25 secondes).
Modifier: Pourquoi le mien prendre si sacrément long.
La fonction de permutation est un énorme goulot d'étranglement dans mon Powershell version. Remplacer avec
'{0};{1};{2}'
de style de sortie comme Roman Kouzmine la réponse de couper vers le bas à moins de 9 minutes. Remplacement deTextFieldParser
de plus de la moitié du reste à moins de 4 minutes.Toutefois, un .NET console de version de l'application de Romain Kouzmine la réponse a pris 20 secondes.
J'aimerais faire de cette façon: