2017-02-20 91 views
2

我有2個帶有用戶名的CSV文件。
我想只導出兩個文件中不存在的用戶的名稱。比較兩個CSV並僅導出兩個不存在的名稱列表

的代碼我現在有:

$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

看起來像我的出口是不正確的。感謝所有的答案將測試它。 – Provo

回答

2

使用Select-Object name從比較-對象的輸出只提取名稱字段:

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

注:

  • sort -unique刪除重複數據和排序列表。
  • 萬一CSV是巨大的,使用HashSet
+1

+1。這裏的其他一些答案提到了** SideIndicator **,當你想從_both_輸入對象中輸入不匹配的條目時沒有什麼幫助,但在其他情況下有用。 –

0

使用SideIndicator得到的差異。

$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 

注意:您可以使用排序-unique也是你的情況。

希望它有幫助。

+0

您可以使用** - IncludeEqual **,然後使用'Where-Object' cmdlet忽略這些情況(它們相互抵消)。實際上,這意味着這裏的解決方案實際上與原始示例沒有任何不同。 –

+0

我試過了,它的工作正常。如果你希望我可以發送相同的截圖@CharlieJoynt –

1

嘗試像這樣使用Compare-Object只差異從文件1

$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 

如果你希望所有的差異(兩個文件)刪除此部分:

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

偉大的,這個工程。謝謝Esperento57 – Provo

+0

總是低調無解釋 – Esperento57

1

如果您不介意using linq/NET,這將列出目前在兩個列表中的用戶:

$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不具有相反/相反的方法相交,但可以使用泛型集合中的SymmetricExceptWith。下面

代碼列出誰是目前無論是在一個列表或另一方,但在無論是在一旦用戶:

$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" 

注:此代碼可能無法在早期的PowerShell版本。