我已经弄清楚如何比较两个文件中的单个列,但我无法弄清楚如何比较两个文件,第一个文件中的一列和第二个文件中的多个列。两者都包含电子邮件。
第一个file.csv (包含带有电子邮件的单列)
john@email.com
jack@email.com
jill@email.com
第二个file.csv (包含多个包含电子邮件的列)
约翰@ email.nl,约翰@ email.eu,约翰@ email.com
吉尔@ email.se,吉尔@ email.com,吉尔@ email.us
通过比较我想输出,差异。这将导致。
Output.csv
jack@email.com
有人能帮助我吗? :)
单列比较和输出差异
#Line extracts emails from list
$SubscribedMails = import-csv .\subscribed.csv | Select-Object -Property email
#Line extracts emails from list
$ValidEmails = import-csv .\users-emails.csv | Select-Object -Property email
$compare = Compare-Object $SubscribedMails $ValidEmails -property email -IncludeEqual | where-object {$_.SideIndicator -eq "<="} | Export-csv .\nonvalid-emails.csv –NoTypeInformation
(Get-Content .\nonvalid-emails.csv) | ForEach-Object { $_ -replace ',"<="' } > .\nonvalid-emails.csv
答案 0 :(得分:1)
由于第一个文件已经包含每列的电子邮件地址,因此您可以立即导入它。 获取第二个文件并拆分包含多个地址的字符串。 将生成一个具有单独地址的新数组。
根据您的输出判断,您只搜索第一个csv内但不在第二个csv内的地址。
您的代码可能如下所示:
$firstFile = Get-Content 'FirstFile.csv'
$secondFile = (Get-Content 'SecondFile.csv').Split(',')
foreach ($item in $firstFile) {
if ($item -notin $secondFile) {
$item | Export-Csv output.csv -Append -NoTypeInformation
}
}
答案 1 :(得分:0)
你能试试吗?
$One = (Get-Content .\FirstFile.csv).Split(',')
$Two = (Get-Content .\SecondFile.csv).Split(',')
$CsvPath = '.\Output.csv'
$Diff = @()
(Compare-Object ($One | Sort-Object) ($two | Sort-Object)| `
Where-Object {$_.SideIndicator -eq '<='}).inputobject | `
ForEach-Object {$Diff += New-Object PSObject -Property @{email=$_}}
$Diff | Export-Csv -Path $CsvPath -NoTypeInformation
Output.csv
将包含FirstFile中存在的条目,但不包含SecondFIle。
答案 2 :(得分:0)
如果您想维护代码,可以考虑使用以下脚本:
#Line extracts emails from list
$SubscribedMails = import-csv .\subscribed.csv | Select-Object -Property email
Rename-Item .\users-emails.csv users-emails.csv.bk
Get-Content .\users-emails.csv.bk).replace(',', "`r`n") | Set-Content .\users-emails.csv
#Line extracts emails from list
$ValidEmails = import-csv .\users-emails.csv | Select-Object -Property email
$compare = Compare-Object $SubscribedMails $ValidEmails -property email -IncludeEqual | where-object {$_.SideIndicator -eq "<="} | Export-csv .\nonvalid-emails.csv –NoTypeInformation
(Get-Content .\nonvalid-emails.csv) | ForEach-Object { $_ -replace ',"<="' } > .\nonvalid-emails.csv
Remove-Item .\users-emails.csv
Rename-Item .\users-emails.csv.bk users-emails.csv
或者,更简单的
#Line extracts emails from list
$SubscribedMails = import-csv .\subscribed.csv | Select-Object -Property email
Get-Content .\users-emails.csv).replace(',', "`r`n") | Set-Content .\users-emails.csv.bk
#Line extracts emails from list
$ValidEmails = import-csv .\users-emails.csv.bk | Select-Object -Property email
$compare = Compare-Object $SubscribedMails $ValidEmails -property email -IncludeEqual | where-object {$_.SideIndicator -eq "<="} | Export-csv .\nonvalid-emails.csv –NoTypeInformation
(Get-Content .\nonvalid-emails.csv) | ForEach-Object { $_ -replace ',"<="' } > .\nonvalid-emails.csv
Remove-Item .\users-emails.csv.bk
答案 3 :(得分:0)
到目前为止没有任何建议有效:(
仍然希望:)
快乐时会删除评论:p