首页 > 解决方案 > 比较 powershell 中的 2 个 csv 用户列表并在 csv 文件上创建所有差异

问题描述

我的代码卡住了,有人可以帮我吗?我得到了 csv 文件,例如:

昨天.csv:

email,UPN
Joe.Jones@test.ch,JoeJ
Mark.Miller@test.ch,MarkM
Bob.Brown@test.ch,BobB
Frank.Funk@test.ch,FrankF
Roger.Fed@test.ch,RogerF

今天.csv:

email,UPN
Joe.Jones@test.ch,JoeJ
Mark.Miller@test.ch,MarkM
Frank.Funk@test.ch,FrankF
Roger.Federer@test.ch,RogerF

代码:

$yesterday = Import-Csv C:\Tools\Scripts\yesterday.csv
$today = Import-Csv C:\Tools\Scripts\today.csv

$users = @()

foreach ($u in $today) {
    $u2 = $yesterday | Where-Object { $_.email -ne $u.email -and $_.UPN -eq $u.UPN } | Select email, UPN -First 1 
    if ($u2)
    { $users += $u2 } 
}

$users | Export-Csv -Path C:\Tools\Scripts\csv3.csv -NoTypeInformation -Force

我想要一个包含电子邮件和 UPN 的第三个 csv 文件,其中今天的电子邮件地址已从昨天更改(并保留昨天)以及用户今天未出现的位置(可以删除)

我得到的结果是:

"email","UPN"
"Roger.Federer@test.ch","RogerF"

我想要的是 :

"email","UPN"
"Bob.Brown@test.ch","BobB"
"Roger.Federer@test.ch","RogerF"

标签: powershellcsv

解决方案


你可以使用这样的东西。请注意,我正在对 CSV 进行硬编码,您应该改用Import-Csv指向您的 CSV。我也ConvertTo-Csv用来在这里显示结果,你应该Export-Csv改用。

最后,$map如果您的 Csv 中有 2 个或更多用户具有完全相同的 UPN,则哈希表可能会引发错误。

$yesterday = @'
email,UPN
Joe.Jones@test.ch,JoeJ
Mark.Miller@test.ch,MarkM
Bob.Brown@test.ch,BobB
Frank.Funk@test.ch,FrankF
Roger.Fed@test.ch,RogerF
'@ | ConvertFrom-Csv

$today = @'
email,UPN
Joe.Jones@test.ch,JoeJ
Mark.Miller@test.ch,MarkM
Frank.Funk@test.ch,FrankF
Roger.Federer@test.ch,RogerF
'@ | ConvertFrom-Csv

$map = @{}
$yesterday.ForEach({
    $map.Add($_.UPN,$_.email)
})

$(

    # Yesterday CSV where the UPN does not exist in Today CSV
    $yesterday | Where-Object { $_.UPN -notin $today.UPN }
    
    # Today CSV where UPN exists in Yesterday CSV and
    # email is different from yesterday email
    $today | Where-Object {
        $_.UPN -in $yesterday.UPN -and $_.email -ne $map[$_.UPN]
    } 

) | ConvertTo-Csv -NoTypeInformation

输出

"email","UPN"
"Bob.Brown@test.ch","BobB"
"Roger.Federer@test.ch","RogerF"

推荐阅读