透视数组的数组?

时间:2015-09-17 22:12:06

标签: powershell

以下代码定义了一个矩阵。

$a = @('a','b','x',10), 
     @('a','b','y',20), 
     @('c','e','x',50), 
     @('c','e','y',30)

$a | % { "[$_]"}

我希望按xy来转动数组。预期的结果数组应该是

[a b 10 20]
[c e 50 30]
 - - -- --
     x  y

我认为它需要group-object然后映射。如何在数组上使用group-object

(顺便说一下,为什么这个问题已被投票两次?)

1 个答案:

答案 0 :(得分:1)

由于Group-Object适用于对象属性,因此无法将Group-Object与数组一起使用(至少不是您想要的方式)。解决方法是将行组织到要分组的标签中,然后是要分配给组的值。然后你可以在标签上分组:

$a | %{ 
    new-object PsObject -prop @{"label" = "$($_[0]),$($_[1])"; value=@{ $_[2]=$_[3]}} 
} | Group-Object label

所以,那么你有一个组,你的条目被作为每个组中的一个哈希表数组进行stroed:

 Count Name                      Group                                 

 ----- ----                      -----                                                                                                   
     2 a,b                       {@{value=System.Collections.Hashtable; label=a,b}, @{value=System.Collections.Hashtable; label=a,b}}    
     2 c,e                       {@{value=System.Collections.Hashtable; label=c,e}, @{value=System.Collections.Hashtable; label=c,e}}

然后,您可以展开每一行以获得所需的信息:

$a | %{ 
    new-object PsObject -prop @{"label" = "$($_[0]),$($_[1])"; value=@{ $_[2]=$_[3]}} 
} | 
group label | % {
    "[$(@($_.Name -split ",") + @($_.Group.value.values))]"
} 

给出:

[a b 10 20]
[c e 50 30]

要回答您的第二条评论,以上没有赢得; t保证订单。为了保证它,你必须明确:

$a | %{ 
    new-object PsObject -prop @{"label" = "$($_[0]),$($_[1])"; value=@{ $_[2]=$_[3]}} 
} | 
group label | % {
    "[$(@($_.Name -split ",") + @($_.Group.value.x, $_.Group.value.y))]"
}