使用PowerShell从CSV中筛选不重复项



我想比较两个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

相关内容

  • 没有找到相关文章

最新更新