比较两个文件:FirstFile中的单列 - SecondFile中的多列

时间:2017-03-15 10:06:00

标签: powershell csv

我已经弄清楚如何比较两个文件中的单个列,但我无法弄清楚如何比较两个文件,第一个文件中的一列和第二个文件中的多个列。两者都包含电子邮件。

第一个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

4 个答案:

答案 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