比较CSV中的两列或更多列,并合并新csv中的匹配数据

时间:2014-01-29 14:29:07

标签: powershell csv

我有两个CSV文件,两个都有2个公共列(计算机名和日期)。 一个CSV文件有5列,第二个CSV有22列。

我想将两个列数据(计算机名称和日期)与第二个CSV文件进行比较,如果匹配,则在CSV 1(5列)中再添加一列,并插入来自不同列的数据。

第一个csv数据

Computer Name   Creation time

12301825        9/1/2013 1:23

23304825        8/1/2013 1:23

43307825        6/1/2013 1:23

53308825        9/1/2013 1:23

63305825        5/1/2013 1:45

73305825        9/1/2013 1:45

第二个csv数据

Computer Name   Creation time   Value

12301825        9/1/2013 1:23   2

27704825        8/1/2013 1:23   3

43307825        6/1/2013 1:23   4

53308825        9/1/2013 1:23   5

63305825        5/1/2013 1:45   9

73305825        9/1/2013 1:45   7

我想比较两个csv文件中的列,如果值匹配,则比较第一个csv文件中的合并值列。

我尝试开始创建脚本,但我不知道如何在powershell中完成。

$alert=Import-Csv -Path ".\alert.csv" -Header "Computer Name" | Sort-object Property "Computer Name" -Unique 
$threat = Import-Csv ".\threat.csv" -Header "Computer Name" |Sort-Object -Property "Computer Name" -Unique
Compare-Object $alert $threat -Property  "Computer Name" |  Where-Object{$_.SideIndicator -eq '=>'} | 
    Select-Object  "Computer Name" | export-csv .\Difference.csv -NoTypeInfo

这不是我想要创建的脚本,因为它与我的要求无关。

更新

alert.csv包含22列,threat.csv包含5列。我想将threat.csv与alert.csv进行比较。

当我在脚本下面运行时,我得到这样的输出文件。

$alert=Import-Csv -Path "d:\ps\alert.csv"
$threat = Import-Csv -Path "d:\ps\threat.csv"
ForEach($Record in $threat){
    $MatchedValue = (Compare-Object $alert $Record -Property "Computer Name","Creation time" -IncludeEqual -ExcludeDifferent -PassThru).value
    $Record = Add-Member -InputObject $Record -Type NoteProperty -Name "Values" -Value $MathedValue
}
$threat|Export-Csv "d:\ps\threatss.csv" -NoTypeInformation

文件数据输出

PK!?z?b??[Content_Types].xml ??(??T?N?0?#???(q?!?G?|??7?U?????=??V?J???$?????{2?4.[CB|)??Hd?u0?/J?????Iy?\?P?-??M//&o????R?D?NJ?54  Values
"???*?F???J/???ht#u??rj1?t???5??U?g?0??8I??s\0???????*Fg?""V.???a?CUY
&?U?\Ev??   ???d*?  ???W?;????Q??az?8<n?o3?????F`?n???!"    
????[=? 
&$???W?4?K??H"?xR??d?????N?9????Aw(7ey/???O??   
???h?????m?|    
?}D?g"$?4??F?Y??.2#???5?9????Y]b??d??@??%?s?"??0?tB??)???[??????????PK!?p??Hxl/workbook.xml?Q?N?0?#????I????TB??!Q??7?U?l????U  

1 个答案:

答案 0 :(得分:3)

我认为你可能会让事情变得复杂。试试这个:

$alert=Import-Csv -Path ".\alert.csv"
$threat = Import-Csv ".\threat.csv"
ForEach($Record in $alert){
    $MatchedValue = (Compare-Object $threat $Record -Property "Computer Name","Creation time" -IncludeEqual -ExcludeDifferent -PassThru).value
    $Record = Add-Member -InputObject $Record -Type NoteProperty -Name "Value" -Value $MatchedValue
}
$alert|Export-Csv ".\Combined.csv" -NoTypeInformation

单步执行此操作,它首先将alert.csv导入$ alert数据集。然后对threat.csv和$ threat做同样的事情。然后逐步浏览$ alert数据集中的每条记录,并在$ threat中查找匹配的记录,其中计算机名称和创建时间相等。它从$ threat中的匹配记录中保存Value字段,将该值(如果有的话)添加到$ alert中的当前记录,然后转到$ alert中的下一条记录。解析$ alert中的所有记录后,它会将组合数据集导出到Combined.csv。

如果您有任何问题或疑问,请与我们联系。