首页 > 解决方案 > Powershell Group-对象数组列表

问题描述

在数组列表中添加了两个逗号分隔的项目,我想将它们分组以计算总数。

$list_distinct = [System.Collections.ArrayList]@()
$list_distinct.Add("Site A,Item A")
$list_distinct.Add("Site A,Item A")
$list_distinct.Add("Site A,Item B")
$list_distinct.Add("Site B,Item C")
$list_distinct.Add("Site B,Item D")
$list_distinct.Add("Site B,Item D")

试过这个:

$test = $list_distinct | Group-Object Values

结果显示 Count(全部总数)、Name(空)和 Group(全部添加的项目)。

有任何解决这个问题的方法吗?或者有没有更好的方法?

所需的输出示例:

Site   | Item   | Count
Site A | Item A |   2
Site A | Item B |   1
Site B | Item C |   1
Site B | Item D |   2

标签: arrayspowershellgroup-bycountcomma

解决方案


对象及其元素都ArrayList没有属性Values。不存在的属性将扩展为空结果,因此您的所有值都分组在相同(空)名称下。

改变这个

$list_distinct | Group-Object Values

进入这个

$list_distinct | Group-Object

问题就会消失。

对于您想要的输出,您还需要拆分值并创建新的(自定义)对象:

$list_distinct | Group-Object | ForEach-Object {
    $site, $item = $_.Name -split ','
    New-Object -Type PSObject -Property @{
        'Site'  = $site
        'Item'  = $item
        'Count' = $_.Count
    }
} | Select-Object Site, Item, Count

尾随Select-Object是强制字段顺序,因为 PowerShell 哈希表默认情况下不排序。

在 PowerShell v3 和更新版本中,您可以将其简化为

$list_distinct | Group-Object | ForEach-Object {
    $site, $item = $_.Name -split ','
    [PSCustomObject]@{
        'Site'  = $site
        'Item'  = $item
        'Count' = $_.Count
    }
}

Select-Object这里不需要尾随,因为[PSCustomObject]类型加速器隐式使用有序哈希表。


推荐阅读