首页 > 解决方案 > 比较超过 2 列的 2 个 CSV 文件数据

问题描述

我有 2 个 CSV 文件。每个文件具有与下面脚本中提到的相同的列名。

我正在尝试New.csvOld.csv. 为了比较,我查找每个Alertnamein Old.csv,在 中找到匹配的警报New.csv,然后从Timeraised列中检查警报时间。如果警报存在且警报时间相差 3 小时以上,则不显示数据。但如果少于 3 小时,则显示警报并创建Output.csv

示例-

OLD.csv 文件

警报名称、警报描述、主体名称、严重性、引发时间
内存警报,事件描述:在 xyz 服务器上发现内存问题,ABC,错误,13-04-2020 06:47
磁盘空间警报,事件描述:在 xyz1 服务器上发现磁盘空间问题,ABS,错误,13-04-2020 06:31

OLD.csv 包含如下警报:

Alertname: Memory Alert
TimeRaised: 03-04-2020 06:23

New.csv 包含如下警报:

Alertname: Memory Alert
TimeRaised: 03-04-2020 9:24

Output.csv由于时差超过 3 小时,我不希望显示该警报。如果少于 3 小时,请将其包含在Output.csv.

我的工作- 我只能根据 Alertname 比较两个文件上的警报,它不能同时比较 2 个不同的变量,这意味着由于限制,我无法从下面的代码中一次比较 Alertname 和 Timeraised。谁能指导我完成这个。

$path= "C:\CSV"
$Old = import-csv $path\Old.csv    # Original file
$New = import-csv $path\New.csv  # New ALert File



$Results =Compare-Object $Old $New -property AlertName -passThru | Where-Object { $_.SideIndicator -eq '=>' } 

$Array = @()       
Foreach($R in $Results)
{
    If( $R.sideindicator -eq "=>" )
    {
        $Object = [pscustomobject][ordered] @{

            AlertName = $R.AlertName
            AlertDescription = $R.AlertDescription
            PrincipalName = $R.PrincipalName
            Severity = $R.Severity
            TimeRaised = $R.TimeRaised


        }
        $Array += $Object
    }
}

#Display results in console
$Array | Export-Csv $path\output1.csv -NoTypeInformation

标签: powershellcsv

解决方案


这应该有效。确保添加属性timeraised

// previous code 
$Results =Compare-Object $Old $New -property "AlertName","timeraised" -passThru |             
Where-Object { $_.SideIndicator -eq '=>' } 
// rest of code

推荐阅读