PowerShell: Import-CSV sans les en-têtes et supprimer partielle des lignes dupliquées
J'ai un fichier journal qui est au format CSV sans les en-têtes. La première colonne est fondamentalement l'identifiant unique pour les questions en cours d'enregistrement. Il peut y avoir plusieurs lignes avec des détails différents pour le même problème d'identification. Je voudrais supprimer des lignes où la première colonne est dupliqué parce que je n'ai pas besoin d'autres données à ce moment.
J'ai assez de connaissances de base de PowerShell à ce point, alors je suis sûr qu'il ya quelque chose de simple, je suis absent.
Je suis désolé si c'est un doublon, mais j'ai pu trouver des questions pour répondre à certaines parties de la question, mais pas l'ensemble de la question.
Pour l'instant, ma meilleure supposition est:
Import-Csv $outFile | % { Select-Object -Index 1 -Unique } | Out-File $outFile -Append
Mais cela me donne l'erreur:
Import-Csv : Le membre de "LB" est déjà présent.
Au C:\Users\jnurczyk\Desktop\Scratch\POImport\getPOImport.ps1:6 char:1
+ Import-Csv $outFile | % { Select-Object -InputObject $_ -Indice 1-Unique } | ...
+ ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Import-Csv], ExtendedTypeSystemException
+ FullyQualifiedErrorId : AlreadyPresentPSMemberInfoInternalcollectionadd,Microsoft.PowerShell.Commandes.ImportCsvCommand
À l'aide de la boucle foreach signifie que vous êtes en sélectionnant chaque ligne une ligne. Essayez de supprimer les %{ }.
OriginalL'auteur Joshua Nurczyk | 2013-12-11
Vous devez vous connecter pour publier un commentaire.
Parce que vos données n'a pas d'en-têtes, vous devez spécifier les en-têtes dans votre
Import-Csv
applet de commande. Et ensuite de sélectionner uniquement les enregistrements uniques à l'aide de la première colonne, vous devez le spécifier dans leSelect-Object
applet de commande. Voir le code ci-dessous:De préciser, les en-têtes dans mon exemple sont A, B, et C. Cela fonctionne si vous savez combien de colonnes il y a des. Si vous avez trop peu en-têtes, puis les colonnes sont supprimés. Si vous avez trop d'en-têtes, puis ils deviennent des champs vides.
Essayez d'utiliser
trim()
pour supprimer les espaces.trim() ne fonctionne pas non des objets string. Peut comprendre comment faire interpréter la sortie de Select-Object comme une chaîne de caractères.
Vous ne savez pas où votre espace, mais regardez ça: stackoverflow.com/questions/17180955/...
OriginalL'auteur Benjamin Hubbard
À chaque fois que je chercher une solution à ce problème j'ai couru à travers ce thread. Toutefois, la solution acceptée ici est plus générique que je le voudrais. La fonction ci-dessous s'Incrémente chaque fois qu'il voit le même nom d'en-tête: A, B, C, A1 (D, A2, C1, etc.
System.IO.StreamReader
exige .NET.Juste un heads-up, cette solution n'est pas conforme à la RFC 4180. Il va se casser si les en-têtes sont échappées et qui contiennent des virgules. tools.ietf.org/html/rfc4180
OriginalL'auteur user3818571
De développer Benjamin Hubbard post voici un petit Script Sql (en supposant que vous serez l'insertion de ces données dans une table dans une base de données bien sûr!) J'utilise pour créer l'en-tête bien dans mon script:
OriginalL'auteur Mark Kram