Powershell - 根据列对 CSV 文件中的唯一值进行分组和计数

Powershell - Group and count unique values from CSV file based on a column

我正在尝试获取每天完成和失败的作业总数。如果任何特定日期的任何特定 VM(名称字段)的作业失败,它将重试 operation.If 它在第二次尝试中完成,我想忽略失败的计数并相应地减少总计数

示例:

我的代码

$csv =ConvertFrom-Csv @"
Name,Start_time,Status
vm1,20-03-2022,Completed
vm2,20-03-2022,Completed

vm1,21-03-2022,Failed
vm1,21-03-2022,Completed
vm2,21-03-2022,Completed

vm1,22-03-2022,Completed
vm2,22-03-2022,Failed
vm2,22-03-2022,Failed
"@

$Results = @()
foreach ($group in $csv | Group Start_time)
{
    $Completed = ($group.Group | group status | ? Name -eq Completed).Count
    $Failed = ($group.Group | group status | ? Name -eq Failed).Count
    $row = "" | Select Date,Total,Completed,Failed,"Success %"
    $row.Date = $group.Name
    $row.Total = $group.Count
    $row.Completed = $Completed
    $row.Failed = $Failed
    $row."Success %" =  [math]::Round($Completed / $row.Total * 100,2)
    $Results += $row
}

以上代码将给我输出:

Date            Total       Completed       Failed          Success %
20-03-2022      2               2             0               100
21-03-2022      3               2             1               66.67
22-03-2022      3               1             2               33.33

但我每天都在寻找每个虚拟机的唯一值并忽略失败,任何重试都显示为已完成

Date            Total       Completed       Failed          Success %
20-03-2022      2               2             0               100      -> Job completed for vm1 and vm2
21-03-2022      2               2             0               100      -> job failed for vm1 first, but in second try it completed. same day 2 entries for vm1(Failed and Completed. Ignore failure and take only completed)
22-03-2022      2               1             1               50       -> vm2 failed on both attempt. so it has to take as 1 entry. ignore the duplicate run.

这似乎行得通,不用说,您正在以一种非常不正统的方式显示信息。我相信您当前拥有的代码就是信息的显示方式。

使用此 CSV 进行演示:

$csv = ConvertFrom-Csv @"
Name,Start_time,Status
vm1,20-03-2022,Completed
vm2,20-03-2022,Completed
vm1,21-03-2022,Failed
vm1,21-03-2022,Completed
vm2,21-03-2022,Completed
vm1,22-03-2022,Completed
vm2,22-03-2022,Failed
vm2,22-03-2022,Failed
vm1,23-03-2022,Failed
vm1,23-03-2022,Failed
vm2,23-03-2022,Failed
vm2,23-03-2022,Failed
"@

代码:

$csv | Group-Object Start_Time | ForEach-Object {
    $completed = 0; $failed = 0
    $thisGroup = $_.Group | Group-Object Name
    foreach($group in $thisGroup) {
        if('Completed' -in $group.Group.Status) {
            $completed++
            continue
        }
        $failed++
    }
    $total = $completed + $failed

    [pscustomobject]@{
        Start_Date = $_.Name
        Total      = $total
        Completed  = $completed
        Failed     = $failed
        Success    = ($completed / $total).ToString('P0')
    }
} | Format-Table

结果:

Start_Date Total Completed Failed Success
---------- ----- --------- ------ -------
20-03-2022     2         2      0 100%
21-03-2022     2         2      0 100%
22-03-2022     2         1      1 50%
23-03-2022     2         0      2 0%