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

Powershell 比较CSV中的两列或更多列,并在新CSV中合并匹配数据,powershell,csv,Powershell,Csv,我有两个CSV文件,都有两个公共列(计算机名和日期)。 一个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

我有两个CSV文件,都有两个公共列(计算机名和日期)。 一个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列。我想比较threats.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  
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值
“?*?F???J/??ht?u?rj1?t???5?u?g?0?8I?s?0?Fg?”“V?a?CUY?”

&我想你可能把事情复杂化了。试试这个:

$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中,并添加该值(如果有)到$alert中的当前记录,并移动到$alert中的下一个记录。在解析$alert中的所有记录后,它将组合数据集导出到combined.csv


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

我认为您可能把事情复杂化了。尝试以下方法:

$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中,并添加该值(如果有)到$alert中的当前记录,并移动到$alert中的下一个记录。在解析$alert中的所有记录后,它将组合数据集导出到combined.csv


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

我认为您可能把事情复杂化了。尝试以下方法:

$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中,并添加该值(如果有)到$alert中的当前记录,并移动到$alert中的下一个记录。在解析$alert中的所有记录后,它将组合数据集导出到combined.csv


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

我认为您可能把事情复杂化了。尝试以下方法:

$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中,并添加该值(如果有)到$alert中的当前记录,并移动到$alert中的下一个记录。在解析$alert中的所有记录后,它将组合数据集导出到combined.csv



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

您的值行有一个输入错误,应该是“Value$MatchedValue”,但答案很好!感谢您的帮助。我会尝试让您知道状态。感谢您的帮助。我想到的一个问题是,是否可以在第一个csv文件中插入列,而不是创建几个文件,因为第一个csv包含其他3列,我也需要这些值。当然,但新文件中应该已经有这些值。如果要替换现有文件,只需更改要输出到的文件的名称。因此,在最后一行
Export Csv.\Combined.Csv”-NoTypeInformation
变成
Export Csv.\alert.Csv“-NoTypeInformation
@TheMadTechnician:问题尚未解决。我没有获得所需的输出。我想再添加一列“值”在现有文件中,threat.csv.threat.csv在增值列后有5列,总共有6列。到目前为止,我没有得到任何数据,我只得到垃圾数据。你在值行上有一个拼写错误,应该是“value$MatchedValue”,但回答得很好!感谢你的帮助。我会尝试让你知道状态。谢谢你的帮助。on我想到的问题是,是否可以在第一个csv文件中插入列而不是创建几个文件,因为第一个csv包含其他3列,我也需要这些值。当然,但新文件中应该已经有这些值。如果要替换现有文件,只需更改输出到.S的文件的名称即可o在最后一行
Export Csv.\Combined.Csv”-NoTypeInformation
变为
Export Csv.\alert.Csv”-NoTypeInformation
@TheMadTechnician:问题尚未解决。我没有得到所需的输出。我想再添加一列“值”在现有文件中,threat.csv.threat.csv在增值列后有5列,总共有6列。到目前为止,我没有得到任何数据,我只得到垃圾数据。你在值行上有一个拼写错误,应该是“value$MatchedValue”,但回答得很好!感谢你的帮助。我会尝试让你知道状态。谢谢你的帮助。on问题是,是否可以在第一个csv文件中插入列而不是cr