Powershell:在2个CSV文件中合并选择性列

时间:2013-07-16 15:27:47

标签: file powershell join csv

由于突然需要编写脚本,要将2个csv文件与具有至少1个公共列的行和列组合,我将使用powershell。我是Powershell的诺布。任何人都可以建议如何从两个文件中读取,比较和组合一行与一个公共列,最后输出到另一个文件?


CSV文件1
==========

主持ABC DEF
===== === ===
SVR01 10 100
SRV02 22 99



CSV文件2
==========

主机UVW XYZ
===== === ===
SVR01 13 10.5
SRV02 19 8.9



预期产量
===============

主机DEF UVW XYZ
= ===== === === ===
SVR01 100 13 10.5
SRV02 99 19 8.9


希望寻求一些指导。

谢谢。
SAM

1 个答案:

答案 0 :(得分:2)

如果文件不会太大,我会使用公共列值作为键将一个加载到哈希表中,然后迭代第二个文件并使用键值查找要从第一个合并的列文件。如果第一个文件很大(你的内存大小取决于你有多少RAM),你只需要注意吃掉太多内存,因为它的全部内容都会被加载到内存中。

#Make an empty hash table for the first file

$File1Values = @{}


#Import the first file and save the rows in the hash table indexed on "KeyColumn"

Import-Csv -Path c:\file1.csv | ForEach-Object {
  $File1Values.Add($_.KeyColumn, $_)
}


#Import the second file, using Select-Object to select all the values from file2,
#  and adding custom properties from the first file using the name/expression
#  hash tables.

Import-Csv -Path c:\file2.csv | Select-Object *,@{
  Name="ABC"; Expression={$File1Values[$_.KeyColumn].ABC}
}, @{
  #You can abbreviate Name/Expression
  N="DEF"; E={$File1Values[$_.KeyColumn].DEF}
} | Export-Csv -Path c:\OutFile.csv

对于最后一节,您还可以使用这些技术中的任何一种The Many Ways to Create a Custom Object来创建自定义对象,我选择了“Select-Object”方法,因为您只需要重建即将到来的对象的位从第一个文件开始(以更复杂的语法为代价)。

如果您使用的是V3并希望使用新的[PsCustomObject]类型加速器,那么最后一位将如下所示(请注意您必须手动添加文件1和文件2属性):

#Import the second file and make a custom object with properties from both files

Import-Csv -Path c:\file2.csv | ForEach-Object {
  [PsCustomObject]@{
    ABC = $File1Values[$_.KeyColumn].ABC;
    DEF = $File1Values[$_.KeyColumn].DEF;
    UVW = $_.UVW;
    XYZ = $_.XYZ;
  }
} | Export-Csv -Path c:\OutFile.csv