我想比较两个csv文件中的值,并从source2返回任何与source1中的条目不匹配的条目,同时忽略任何重复的条目。以下是我的尝试,但不会返回所有条目。让这个脚本满足我需要的最佳方式是什么?
$AD = Import-CSV -Path "source1.csv"
$Student = Import-CSV -Path "source2.csv"
$AD |OuterJoin-Object $Student -on UserPrincipalName | Export-CSV -Path "Path.csv"
Source1和Source2csv具有列"csv";名称"UserPrincipalName";,以及";TeamDesc";。我想用这些来匹配条目。理想情况下,输入/输出如下所示:
Source1.csv
| TeamDesc | UserPrincipalName | Name |
|:---------|:--------------------|:------------|
| Team 1 | student1@domain.com | john smith |
| Team 1 | student2@domain.com | nancy drew |
| Team 2 | student3@domain.com | harvey dent |
Source2.csv
| TeamDesc | UserPrincipalName | Name |
|:---------|:--------------------|:------------|
| Team 1 | student1@domain.com | john smith |
| Team 2 | student3@domain.com | harvey dent |
Export.csv
| TeamDesc | UserPrincipalName | Name |
|:---------|:--------------------|:-----------|
| Team 1 | student2@domain.com | nancy drew |
不确定如何使用OuterJoin-Object
。我想你想这么做:
$AD = Import-Csv source1.csv | Group-Object UserPrincipalName -AsHashTable -AsString
$Student = Import-CSV -Path source2.csv
@(
$AD.Values.ForEach{ $_ }
$Student.Where{ -not $AD.ContainsKey($_.UserPrincipalName) }
) | Export-CSV -Path Path.csv -NoTypeInformation
如果您想排除来自source2.csv
的可能重复,您可以使用以下方法:
@(
$AD.Values.ForEach{ $_ }
$Student.Where{ -not $AD.ContainsKey($_.UserPrincipalName) }.
ForEach{ $AD[$_.UserPrincipalName] = $null }
) | Export-CSV -Path Path.csv -NoTypeInformation
现在看看你现在编辑的答案,它提供了预期的输出,看起来你真正想要的是:
$set = [System.Collections.Generic.HashSet[string]]::new(
[string[]] (Import-CSV -Path stundent.csv).UserPrincipalName,
[System.StringComparer]::InvariantCultureIgnoreCase
)
Import-Csv ad.csv | Where-Object { $set.Add($_.UserPrincipalName) } |
Export-Csv pathtooutput.csv -NoTypeInformation
$Source1 = ConvertFrom-Csv @'
TeamDesc, UserPrincipalName, Name
"Team 1", student1@domain.com, "john smith"
"Team 1", student2@domain.com, "nancy drew"
"Team 2", student3@domain.com, "harvey dent"
'@
$Source1 = ConvertFrom-Csv @'
TeamDesc, UserPrincipalName, Name
"Team 1", student1@domain.com, "john smith"
"Team 2", student3@domain.com, "harvey dent"
'@
$Source1 |OuterJoin $Source2 -On Name,TeamDesc
TeamDesc UserPrincipalName Name
-------- ----------------- ----
Team 1 {student2@domain.com, $null} nancy drew
请注意,UserPrincipalName有两个值,一个来自左表,另一个来自右表(空(。这将向您显示缺少信息的一侧。您还可以使用-Name
参数进一步区分属性,例如:
$Source1 |OuterJoin $Source2 -On Name,TeamDesc -Name Source1,Source2
TeamDesc Source1UserPrincipalName Source2UserPrincipalName Name
-------- ------------------------ ------------------------ ----
Team 1 student2@domain.com nancy drew
或者只剩下左边的属性:
$Source1 |OuterJoin $Source2 -On Name,TeamDesc -Property 'Left.*'
TeamDesc UserPrincipalName Name
-------- ----------------- ----
Team 1 student2@domain.com nancy drew