首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换PSObject列

转换PSObject列
EN

Stack Overflow用户
提问于 2017-02-22 17:59:20
回答 1查看 1.1K关注 0票数 0

我正在尝试从我正在创建的数据集中“折叠”行。“站点”列中的值是我希望作为列的值。

下面是一个例子,说明表现在的样子以及我希望它看起来是什么样子:

代码语言:javascript
复制
$RowA1 = @{ObjectPath="Setting1";CtrlValue="ABC";TestValue="DEF";Site="clientA"}
$RowA2 = @{ObjectPath="Setting2";CtrlValue="123";TestValue="456";Site="clientA"}
$RowA3 = @{ObjectPath="Setting1";CtrlValue="ABC";TestValue="GHI";Site="clientB"}
$RowA4 = @{ObjectPath="Setting2";CtrlValue="123";TestValue="789";Site="clientB"}
$Source = $RowA1,$RowA2,$RowA3,$RowA4
$Source | %({[PSCustomObject]$_}) | select ObjectPath,CtrlValue,TestValue,Site | Format-Table -AutoSize

Write-Host "--------------------------------------------------------"

$RowB1 = @{ObjectPath="Setting1";CtrlValue="ABC";clientA="DEF";clientB="GHI"}
$RowB2 = @{ObjectPath="Setting2";CtrlValue="123";clientA="456";clientB="789"}
$Dest = $RowB1,$RowB2
$Dest | %({[PSCustomObject]$_}) | select ObjectPath,CtrlValue,clientA,clientB | Format-Table -AutoSize



ObjectPath CtrlValue TestValue Site   
---------- --------- --------- ----   
Setting1   ABC       DEF       clientA
Setting2   123       456       clientA
Setting1   ABC       GHI       clientB
Setting2   123       789       clientB


--------------------------------------------------------

ObjectPath CtrlValue clientA clientB
---------- --------- ------- -------
Setting1   ABC       DEF     GHI    
Setting2   123       456     789  
  1. 如何动态地执行这种类型的转换(在第一个数据集中也可能有一个clientC )?
  2. 这种类型的转换(可能是分区)的名称是什么?

我可以通过编程方式创建所需的结果集,但在处理数据集时,我希望在Powershell中使用更多的查询样式说明。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-22 18:27:11

按标识组的属性分组,然后通过循环遍历组成员添加列。例如:

代码语言:javascript
复制
$RowA1 = @{ObjectPath="Setting1";CtrlValue="ABC";TestValue="DEF";Site="clientA"}
$RowA2 = @{ObjectPath="Setting2";CtrlValue="123";TestValue="456";Site="clientA"}
$RowA3 = @{ObjectPath="Setting1";CtrlValue="ABC";TestValue="GHI";Site="clientB"}
$RowA4 = @{ObjectPath="Setting2";CtrlValue="123";TestValue="789";Site="clientB"}
$RowA5 = @{ObjectPath="Setting1";CtrlValue="ABC";TestValue="JKL";Site="clientC"}
$Source = $RowA1,$RowA2,$RowA3,$RowA4,$RowA5 | % ({[PSCustomObject]$_})

#Identifier-propteries
$idprop = "ObjectPath", "CtrlValue"

$Dest = $Source |
#Group objects that belong together using identifier-properties
Group-Object -Property $idprop | ForEach-Object {
    #Create new object with common properties
    $obj = $_.Group[0] | Select-Object $idprop

    #Add client-properties
    $_.Group | ForEach-Object {
        Add-Member -InputObject $obj -MemberType NoteProperty -Name $_.Site -Value $_.TestValue
    }

    #Output new "consolidated" object
    $obj

}

#PowerShell only displays the columns in the first object by default. Workaround: Specify all columns we want
#Find all propertynames in collection
$cols = $Dest | % { $_.psobject.properties } | Select-Object -ExpandProperty Name -Unique

#Output using Select-Object
$Dest | Select-Object -Property $cols

输出:

代码语言:javascript
复制
ObjectPath : Setting1
CtrlValue  : ABC
clientA    : DEF
clientB    : GHI
clientC    : JKL

ObjectPath : Setting2
CtrlValue  : 123
clientA    : 456
clientB    : 789
clientC    : 


$Dest | Format-Table -Property $cols -AutoSize

ObjectPath CtrlValue clientA clientB clientC
---------- --------- ------- ------- -------
Setting1   ABC       DEF     GHI     JKL    
Setting2   123       456     789            
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42398979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档