【问题标题】:Format an array of hashtables as table with Powershell使用 Powershell 将哈希表数组格式化为表
【发布时间】:2019-12-26 21:51:21
【问题描述】:

我希望将一组 hastables 显示为表格。我找到了几个处理这个问题的线程,但到目前为止还没有解决方案对我有用(参见 herehere)。

我的数组包含 18 个这种形式的哈希表:

Array = @(
    @{Company=1} 
    @{Company=2} 
    @{Company=3} 
    @{Contact=X} 
    @{Contact=Y} 
    @{Contact=Y} 
    @{Country=A} 
    @{Country=B} 
    @{Country=C} 
)

我想得到以下输出:

Company Contact Country
------------------------------
1                   X                 A
2                   Y                 B
3                   Z                 C

我尝试了以下方法:

$Array | ForEach-Object { New-Object -Type PSObject -Property $_ } | Format-Table

显示如下:

Company
----------
1
2
3

Format-List 效果更好;然后我得到这个:

Company: 1 2 3
Contact: X Y Z
Country: A B C

有什么方法可以完成我想要的输出吗?

【问题讨论】:

    标签: arrays powershell format hashtable


    【解决方案1】:

    如果您想使用 CSV 数据和自定义对象,您可以执行以下操作:

    $Array = @(
        @{Company=1} 
        @{Company=2} 
        @{Company=3} 
        @{Contact='X'} 
        @{Contact='Y'} 
        @{Contact='Z'} 
        @{Country='A'} 
        @{Country='B'} 
        @{Country='C'} 
    )
    
    $keys = $Array.Keys | Get-Unique
    $data = for ($i = 0; $i -lt $Array.($Keys[0]).Count; $i++) {
        ($Keys | Foreach-Object { $Array.$_[$i] }) -join ','
    }
    ($Keys -join ','),$data | ConvertFrom-Csv | Format-Table
    

    说明:

    由于$Array 是一个哈希表数组,那么.Keys 属性将返回这些哈希表的所有键。由于我们在构建对象时只关心唯一键,Get-Unique 用于删除重复项。

    $Array.($Keys[0]).Count 计算组中的项目数。 $Keys[0] 这里将是 Company。因此它返回包含键 Company 的哈希表 (3) 的数量。

    $Array.Company 例如返回哈希表中包含键 Company 的所有值。 Foreach-Object 循环遍历特定索引处的每个唯一键的值 ($i)。在特定索引处读取每个键值后,这些值会以逗号连接。

    当循环完成时,($Keys -join ','),$data 以 CSV 格式输出数据,这些数据通过管道传输到 ConvertFrom-Csv 以创建自定义对象。

    注意:如果您的数据包含逗号,您可能需要考虑以下替代方法。


    或者,您可以通过以下方式使用哈希表和自定义对象:

    $Array = @(
        @{Company=1} 
        @{Company=2} 
        @{Company=3} 
        @{Contact='X'} 
        @{Contact='Y'} 
        @{Contact='Z'} 
        @{Country='A'} 
        @{Country='B'} 
        @{Country='C'} 
    )
    $keys = $Array.Keys | Get-Unique
    $data = for ($i = 0; $i -lt $Array.($Keys[0]).Count; $i++) {
        $hash = [ordered]@{}
        $Keys | Foreach-Object { $hash.Add($_,$Array.$_[$i]) }
        [pscustomobject]$hash
    }
    $data | Format-Table
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 2020-07-29
      • 2013-07-19
      • 1970-01-01
      • 2017-05-13
      相关资源
      最近更新 更多