我如何纠正我的.csv文件的和解,以删除重复/空



我一直在使用这个答案的代码来检查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

团队1student1@domain.com团队1student2@domain.com神探南茜第二组student3@domain.com哈维削弱团队3student1@domain.com

尝试以下操作,使用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中的漂亮答案所示.

相关内容

  • 没有找到相关文章

最新更新