【问题标题】:Compare two column or more column in CSV and merge match data in new csv比较 CSV 中的两列或更多列并在新的 csv 中合并匹配数据
【发布时间】:2014-02-21 10:16:12
【问题描述】:

我有两个 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 列,Threats.csv 包含 5 列。我想将威胁.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  

【问题讨论】:

    标签: powershell csv


    【解决方案1】:

    我认为您可能过于复杂了。试试这个:

    $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。

    如果您有任何问题或疑问,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2022-12-18
      • 2014-02-21
      • 2015-12-22
      • 2017-11-22
      相关资源
      最近更新 更多