2017-02-20 1 views
2

J'ai 2 fichiers CSV avec des noms d'utilisateur.
Je souhaite exporter uniquement les noms d'utilisateurs qui n'existent pas dans les deux fichiers.Comparez deux fichiers CSV et exportez uniquement une liste de noms qui n'existent pas dans les deux.

Le code que j'ai maintenant:

$file1 = import-csv -Path "C:\ps\output\adusers.csv" 
$file2 = import-csv -Path "C:\ps\output\users.csv" 
Compare-Object $file1 $file2 -property name | Export-Csv -NoTypeInformation -Path "C:\ps\result\result.csv" 
+0

On dirait que mes exportations ne sont pas correctes. Merci pour toutes les réponses vont le tester. – Provo

Répondre

2

Utilisez Select-Object name pour extraire uniquement le champ Nom de la sortie Compare-Object:

Compare-Object $file1 $file2 -Property name | 
    select name | 
    sort -unique -Property name | 
    Export-Csv -NoTypeInformation -Path "C:\ps\result\result.csv" 

Notes:

  • sort -unique déduplique et des tris la liste.
  • Dans le cas où le CSV sont énormes, utilisez HashSet
+1

+1. Quelques autres réponses mentionnent ici ** SideIndicator **, ce qui n'est pas utile lorsque vous voulez des entrées incompatibles avec les deux objets d'entrée, mais utile dans d'autres cas. –

0

Utilisez le SideIndicator pour obtenir les différences.

$file1 = import-csv -path C:\Output\Test.csv 
$file2 = import-csv -path C:\Output\DomainUsers.csv 
Compare-Object $file1 $file2 -property name -IncludeEqual | where-object {($_.SideIndicator -eq "=>") -or ($_.SideIndicator -eq "<=") } | Export-csv C:\Output\Difference.csv –NoTypeInformation 

Remarque: Vous pouvez utiliser le genre -Uniqueégalement dans votre cas.

Espérons que ça aide.

+0

Vous utilisez ** - IncludeEqual **, puis utilisez la cmdlet 'Where-Object' pour ignorer ces cas (ils s'annulent mutuellement). En effet, cela signifie que la solution ici n'est pas différente de l'exemple original. –

+0

Je l'ai essayé et fonctionne correctement. Si vous souhaitez, je peux envoyer la capture d'écran pour le même @CharlieJoynt –

1

Essayez quelque chose comme ceci à utiliser Compare-Object pour que les différences de fichier1:

$file1=import-csv "C:\temp\test\adusers.csv" 
$file2=import-csv "C:\temp\test\users.csv" 

Compare-Object $file1 $file2 -Property "Name" | 
    Where SideIndicator -eq "<=" | 
    Select Name | 
    Export-Csv "C:\temp\test\result.csv" -NoType 

Si vous voulez que toutes les différences (des deux fichiers) supprimer cette partie:

'Where SideIndicator -eq "<=" |' 
+0

Great, celui-ci fonctionne. Merci Esperento57 – Provo

+0

toujours noob bas voter sans expliquer – Esperento57

1

Si vous ne pas déranger using linq/NET, cela listera les utilisateurs présents dans les deux listes:

$file1 = import-csv -Path "C:\ps\output\adusers.csv" 
$file2 = import-csv -Path "C:\ps\output\users.csv" 
[linq.enumerable]::intersect([object[]]($file1.name), [object[]]($file2.name)) | 
    Export-Csv -NoTypeInformation -Path "C:\ps\result\result.csv" 

Linq n'a pas de méthode inverse/inverse à intersection, mais vous pouvez utiliser SymmetricExceptWith à partir de collections génériques.

code ci-dessous répertorie les utilisateurs qui sont présents soit dans une liste ou d'une autre, mais pas dans les deux à la fois:

$file1 = import-csv -Path "C:\ps\output\adusers.csv" 
$file2 = import-csv -Path "C:\ps\output\users.csv" 
$res = [Collections.Generic.HashSet[String]]([string[]]($file1.name)) 
$res.SymmetricExceptWith([string[]]($file2.name)) 
$res | Export-Csv -NoTypeInformation -Path "C:\ps\result\result.csv" 

Note: ce code ne fonctionne pas sur les versions antérieures powershell.