对每列进行排序并仅显示CSV中的最大值-Powershell

时间:2019-06-07 04:18:15

标签: powershell

我尝试对CSV中的列列表进行排序。它的格式不正确,因为对象类型是system.array。

通过执行类型转换,我可以分别获取单个列的值。有没有一种方法可以对所有列进行类型转换。以下代码仅适用于单个列。

timestamp | abc | A | B | C | D | E | F | G |
6/4/2019
| 6775 | 3059 | 4 | 2292 | 1328 | 764 | 0 | 0 |
6/4/2019
| 6910 | 3167 | 28 | 3568 | 1180 | 1348 | 0 | 0 |
6/4/2019
| 6749 | 3161 | 0 | 2180 | 2060 | 1440 | 0 | 28 |
6/5/2019
| 6738 | 3118 | 4 | 2736 | 1396 | 984 | 0 | 0 |
6/5/2019
| 6718 | 3130 | 12 | 3076 | 1008 | 452 | 0 | 4 |
6/5/2019
| 6894 | 3046 | 4 | 2284 | 1556 | 624 | 0 | 0 |

这是示例csv数据。

$csv=Import-Csv 'M:\MyDoc\script\logfiles\streams_OUTPUT.csv'
$uniquedates=$csv |select timestamp -Unique 
$resultTab  = @();
foreach ($d in $uniquedates)
$array_name = $csv |where {$_.timestamp -like $d.timestamp } | Sort- Object @{expression={if($_.A){[int[]]$_.A}}} -Descending | Select -First 1
$resultTab += $array_name;
}
$resultTab | FT

我想要的输出,我正在寻找的是: timestamp streams A B C D E F G
6/4/2019 6910 3167 28 3568 2060 1440 0 28 6/5/2019 6894 3130 12 3076 1556 984 0 4

1 个答案:

答案 0 :(得分:0)

[编辑-将示例数据更改为新版本,并更改​​了代码以适用于新规范。]

这是完成这项工作的一种方法。 [ grin ]使用PoSh允许一口气从集合中获取单个属性的所有值的方式。 $Collection.PropName将为您提供所有可用的价值。

# fake reading in a CSV
#    in real life, use Import-CSV
$InStuff = @'
timestamp, abc, A, B, C, D, E, F, G
6/4/2019, 6775, 3059, 4, 2292, 1328, 764, 0, 0
6/4/2019, 6910, 3167, 28, 3568, 1180, 1348, 0, 0
6/4/2019, 6749, 3161, 0, 2180, 2060, 1440, 0, 28
6/5/2019, 6738, 3118, 4, 2736, 1396, 984, 0, 0
6/5/2019, 6718, 3130, 12, 3076, 1008, 452, 0, 4
6/5/2019, 6894, 3046, 4, 2284, 1556, 624, 0, 0
'@ | ConvertFrom-Csv

$TargetPropertyList = $InStuff[0].PSObject.Properties.Name.Where({$_ -ne 'TimeStamp'})

$GroupedInStuff = $InStuff |
    Group-Object -Property TimeStamp

$Results = foreach ($GIS_Item in $GroupedInStuff)
    {
    $HighestValues = [ordered]@{
        TimeStamp = $GIS_Item.Name
        }
    foreach ($TPL_Item in $TargetPropertyList)
        {
        $TempHiVal = ($GIS_Item.Group.$TPL_Item.ForEach({[int]$_}) | Sort-Object)[-1]
        $HighestValues.Add($TPL_Item, $TempHiVal)
        }

    [PSCustomObject]$HighestValues
    }

$Results = $Results |
    Sort-Object -Property {[datetime]$_.TimeStamp}

$Results |
    Format-Table

输出...

TimeStamp  abc    A  B    C    D    E F  G
---------  ---    -  -    -    -    - -  -
6/4/2019  6910 3167 28 3568 2060 1440 0 28
6/5/2019  6894 3130 12 3076 1556  984 0  4

请记住,除了最终显示输出到纯文本文件之外,请勿将Format-Table [或其他Format-* cmdlet]用于其他任何用途。他们将您的对象切碎,以格式代码包装,然后将其吐出。如果您尝试将输出用于任何其他工作,它将产生垃圾。