PowerShell对比两个含email字段的CSV文件,提取text2独有的邮箱地址
PowerShell 对比两个CSV文件提取差异邮箱的正确实现
原写法错误原因
- 第一种写法错误点:
- 错误使用
Get-Content读取CSV文件,该命令只会将文件内容按普通文本行读取,不会解析为带email属性的结构化对象,同时会把表头行也当作普通内容参与对比,完全不符合需求 Compare-Object没有指定对比的属性字段,默认对比整个对象的字符串表现,结果必然错误
- 错误使用
- 第二种写法错误点:
- 若
$file1是直接导入CSV得到的对象数组,直接用email值判断是否在$file1数组中,相当于拿字符串和自定义对象做匹配,永远不会命中,所以得不到正确结果
- 若
正确实现方案
第一步:先正确导入两个CSV文件
# 导入两个CSV,自动解析为带email属性的对象数组 $refCsv = Import-Csv -Path "C:\scripts\test1.csv" $diffCsv = Import-Csv -Path "C:\scripts\test2.csv"
方案1:使用Compare-Object实现
指定明确的对比属性为email即可:
Compare-Object -ReferenceObject $refCsv -DifferenceObject $diffCsv -Property email | Where-Object { $_.SideIndicator -eq "=>" } | Select-Object -ExpandProperty email | # 导出结果到TXT文件 Out-File -FilePath "C:\scripts\only_in_test2.txt" # 如果要导出为带表头的CSV可以替换为下面的写法: # Select-Object email | Export-Csv -Path "C:\scripts\only_in_test2.csv" -NoTypeInformation
方案2:使用Where-Object筛选实现
提前把参考文件的所有邮箱提取为字符串数组,再做匹配:
# 先提取test1的所有邮箱为纯字符串数组 $refEmails = $refCsv.email # 筛选test2中不在参考数组里的邮箱 $diffEmails = $diffCsv | Where-Object { $_.email -notin $refEmails } # 导出结果为CSV $diffEmails | Select-Object email | Export-Csv -Path "C:\scripts\only_in_test2.csv" -NoTypeInformation
注意事项
- 如果CSV编码不是系统默认编码,导入/导出时需要加
-Encoding参数指定编码,比如-Encoding UTF8避免乱码 - 邮箱对比默认区分大小写,如果需要不区分大小写,可以把
-notin换成-inot,或者给Compare-Object加-CaseSensitive:$false参数
内容的提问来源于stack exchange,提问作者Ruishoo
相关产品推荐
相关产品推荐

