如何使用Powershell比较两个CSV文件,然后使用比较结果更新其中一个CSV文件

如何使用Powershell比较两个CSV文件,然后使用比较结果更新其中一个CSV文件,powershell,csv,Powershell,Csv,我想比较两个CSV文件“主”和“输入”,然后更新“主”文件,使其包含差异 “主”文件最初将包含一些数据。。。像这样: A,B,C 5,9,cat 1,2,dog 2,8,rabbit 8,8,mouse 6,2,duck “输入”文件可能包含来自主文件的条目,这些条目需要更新,没有更改,或者已经添加: A,B,C 1,2,otter 8,8,mouse 5,3,tiger 现在比较主文件和输入文件,结果如下: 已更新 1,2的主输入之间存在差异 主文件包含:1,2,狗输入文件包含1,2,水獭

我想比较两个CSV文件“主”和“输入”,然后更新“主”文件,使其包含差异

“主”文件最初将包含一些数据。。。像这样:

A,B,C
5,9,cat
1,2,dog
2,8,rabbit
8,8,mouse
6,2,duck
“输入”文件可能包含来自主文件的条目,这些条目需要更新没有更改,或者已经添加:

A,B,C
1,2,otter
8,8,mouse
5,3,tiger
现在比较主文件和输入文件,结果如下:

已更新

1,2的主输入之间存在差异 主文件包含:1,2,输入文件包含1,2,水獭,需要更新主文件

无变化

主文件和输入文件包含:8,8,鼠标,因此不执行任何操作

已添加

输入文件包含一个新条目5,3,tiger,因此主文件将附加该新数据

生成的主文件

A,B,C
5,9,cat
1,2,otter
2,8,rabbit
8,8,mouse
6,2,duck
5,3,tiger
以下是我的代码:

$apples = Get-Content $Input
$oranges = Get-Content $Master

# this will generate the file that contains ONLY the CHANGED or new entries that must be recorded
Compare-Object $apples $oranges -PassThru | Where-Object{ $_.SideIndicator -eq "<=" } | Out-File $OutFile

# this will generate the file that contains the old entries that need to be replaced with the new ones
Compare-Object $apples $oranges -PassThru | Where-Object{ $_.SideIndicator -eq "=>" } | Out-File $FixUp

如果将输入数据视为CSV数据,则可以选择atttributes
Compare Object
应用于比较的内容

$Apples = @'
A,B,C
5,9,cat
1,2,dog
2,8,rabbit
8,8,mouse
6,2,duck
'@ | 
ConvertFrom-Csv
$Oranges = @'
A,B,C
1,2,otter
8,8,mouse
5,3,tiger
'@ | 
ConvertFrom-Csv

Compare-Object -ReferenceObject $Oranges -DifferenceObject $Apples -Property A, B -IncludeEqual -PassThru
最终的结果是:

A B C      SideIndicator
- - -      -------------
1 2 otter  ==
8 8 mouse  ==
5 9 cat    =>
2 8 rabbit =>
6 2 duck   =>
5 3 tiger  <=
A B C侧指示灯
- - -      -------------
12水獭==
8只老鼠==
5.9类=>
2 8兔子=>
6.2鸭子=>

我错了吗?你的“输入文件”看起来和你想要的“结果文件”一模一样?你能更详细地解释一下你的期望吗?您可以使用更多示例数据更新您的问题。-它首先比较“主文件”和输入文件。脚本启动时,“主”没有输入文件中的数据。。。但是,当脚本完成后,它将-我还应该补充,主文件也将1,2,3更改为1,2,4,现在您用更多的词描述了相同的情况。事实是——至少根据您目前提供的示例数据——您最终得到了完整的“输入文件”。是否有一种情况可以考虑,您不使用“输入文件”中的条目?我同意Olaf-根据您的解释和示例数据,输出文件=输入文件。我建议您将示例数据更新为,以便主文件包含输入文件中没有的数据。此外,您需要明确指出,前两个数据项是重要的(键),第三个数据项是更新的“属性”。谢谢。。。但橙子中最终结果1,2,4的行怎么可能是==苹果中的原始行是1,2,3。。。不是1,2,4,因为它以“1,2”开头,这是为比较属性A、B指定的。这就是我们对你的要求。你的比较标准是什么?您可以(重新)阅读
Compare Object
的帮助,以了解其工作原理并设定期望值我更新了答案中的代码片段。代码(比较)实际上保持不变。感谢Olaf。。。很抱歉一开始的混乱…:-)
A B C      SideIndicator
- - -      -------------
1 2 otter  ==
8 8 mouse  ==
5 9 cat    =>
2 8 rabbit =>
6 2 duck   =>
5 3 tiger  <=