我一直在使用这个答案的代码来检查MS团队对班级名单的添加/更改:
$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和Source2(如下所示),检查删除将返回Export1,检查添加将返回Export2。因为会有跨多个类的学生的多个实例,所以我想在过滤器查询中包含TeamDesc,以确保只返回具有该类的学生的特定实例。
Source1.csv
尝试以下操作,使用Compare-Object
通过两个列值比较CSV文件,只需将感兴趣的属性(列)名称传递给-Property
;所得到的输出被分成两个集合,基于输入端的不同属性组合是唯一的,使用内在.Where()
方法:
$removed, $added = (
Compare-Object (Import-Csv Source1.csv) (Import-Csv Source2.csv) -PassThru `
-Property TeamDesc, UserPrincipalName
).Where({ $_.SideIndicator -eq '=>' }, 'Split')
$removed |
Select-Object -ExcludeProperty SideIndicator |
Export-Csv -NoTypeInformation Export1.csv
$added |
Select-Object -ExcludeProperty SideIndicator |
Export-Csv -NoTypeInformation Export2.csv
假设两个csv都存储在内存中,Source1.csv
是$csv1
,Source2.csv
是$csv2
,您已经使用HashSet<T>
拥有Export2.csv
的逻辑:
$set = [System.Collections.Generic.HashSet[string]]::new(
[string[]] $csv1.UserPrincipalName,
[System.StringComparer]::InvariantCultureIgnoreCase
)
$csv2 | Where-Object { $set.Add($_.UserPrincipalName) }
输出:
TeamDesc UserPrincipalName Name
-------- ----------------- ----
Team 2 student4@domain.com tim tams
对于第一个需求,Export1.csv
,引用对象将是$csv2
,而不是HashSet<T>
,您可以使用哈希表,Group-Object -AsHashTable
在这种情况下使它变得非常容易:
$map = $csv2 | Group-Object UserPrincipalName -AsHashTable -AsString
# if Csv2 has unique values for `UserPrincipalName`
$csv1 | Where-Object { $map[$_.UserPrincipalName].TeamDesc -ne $_.TeamDesc }
# if Csv2 has duplicated values for `UserPrincipalName`
$csv1 | Where-Object { $_.TeamDesc -notin $map[$_.UserPrincipalName].TeamDesc }
输出:
TeamDesc UserPrincipalName Name
-------- ----------------- ----
Team 1 student1@domain.com john smith
使用此Join-Object script
/Join-Object Module
(参见:如何比较两个CSV文件并输出仅在其中一个文件中而不在两个文件中的行,以及在Powershell中,将两个表连接为一个的最佳方法是什么?):
加载示例数据:
(在您的情况下,您可能希望使用Import-Csv
导入数据)
Install-Script -Name Read-HtmlTable
$Csv1 = Read-HtmlTable https://stackoverflow.com/q/74452725 -Table 0 # Import-Csv .Source1.csv
$Csv2 = Read-HtmlTable https://stackoverflow.com/q/74452725 -Table 1 # Import-Csv .Source2.csv
Install-Module -Name JoinModule
$Csv1 |OuterJoin $Csv2 -On TeamDesc, UserPrincipalName -Name Out,In
TeamDesc UserPrincipalName OutName InName
-------- ----------------- ------- ------
Team 1 student1@domain.com john smith
Team 2 student4@domain.com tim tams
可以按原样使用(单个)结果文件。如果您真的想处理两个不同的文件,您可以拆分结果,如mklement0中的漂亮答案所示.