比较2 csv的和输出的行差异,以单独的文件

tzxcd3kk  于 2023-09-28  发布在  其他
关注(0)|答案(1)|浏览(122)

我有一个1.csv

姓名、姓氏、身高、城市、县、州、邮编
John,Doe,120,Jefferson,滨江,NJ,8075
Jack,Yan,220,Phila,滨江,PA,9119
Jill,Fan,120,Jefferson,滨江,NJ,8075
史蒂夫,谭,220,费城,滨江,PA,9119
阿尔法,范,120,杰斐逊,滨江,新泽西州,8075
博客,乔,7,华盛顿,WA.1285

和一个2.csv

姓名、姓氏、身高、城市、县、州、邮编
John,Doe,120,Jefferson,滨江,NJ,8075
Jack,Yan,220,Phila,滨江,PA,9119
Jill,Fan,120,Jefferson,滨江,NJ,8075
史蒂夫,谭,220,费城,滨江,PA,9119
Bravo,Tan,220,Phila,滨江,PA,9119
我想比较1.csv和2.csv文件的行,并输出满足以下条件的行

如果存在于1.csv和2.csv中,则输出到Output1.csv
如果在2.csv中存在,但在1.csv中不存在,则输出到Output1.csv
如果在1.csv中存在,但在2.csv中不存在,则输出到Output2.csv

  • 所以Output1.csv应该是 *

John,Doe,120,Jefferson,滨江,NJ,8075
Jack,Yan,220,Phila,滨江,PA,9119
Jill,Fan,120,Jefferson,滨江,NJ,8075
史蒂夫,谭,220,费城,滨江,PA,9119
Bravo,Tan,220,Phila,滨江,PA,9119

  • 和Output2.csv应该是 *

博客,乔,7,华盛顿,WA.1285
大多数类似的问题只输出到一个文件,我需要2个输出。这可能吗?
非常感谢

dxpyg8gm

dxpyg8gm1#

使用Compare-Object比较两个集合,然后使用内部的.Where()扩展方法根据条目是否只在a.csv中找到将结果分为两个:

$a = Import-Csv path\to\a.csv
$b = Import-Csv path\to\b.csv

$outputs = @(
  # compare the two files, output everything, then split based on side-indicator
  Compare-Object $a $b -IncludeEqual
).Where({$_.SideIndicator -ne '<='}, 'Split')

# first collection will be the ones that satisfied `{$_.SideIndicator -ne '<='}`
$outputs[0] |ForEach-Object InputObject |Export-Csv output1.csv -NoTypeInformation
# second collection will be the ones that didn't, eg. the ones only found in a.csv
$outputs[1] |ForEach-Object InputObject |Export-Csv output2.csv -NoTypeInformation

如果你想输出到3个不同的文件,我建议在侧边指示器上使用Group-Object分组:

Compare-Object $a $b -IncludeEqual |Group-Object SideIndicator |ForEach-Object {
  # determine name of output file based on indicator
  $outputNames = @{'<='='a_only.csv';'=='='both.csv';'=>'='b_only.csv'}
  $outputName = $outputNames[$_.Group[0].SideIndicator]

  $_.Group |ForEach-Object InputObject |Export-Csv $outputName -NoTypeInformation
}

相关问题