2017-02-22 4 views
0

Я пытаюсь «свернуть» строки из набора данных, который я создаю. Значения в столбце «Сайт» - это то, что я хотел бы иметь в качестве столбцов.Преобразование столбцов PSObject

Вот пример того, что таблица выглядит сейчас и то, что я хотел бы, чтобы это выглядело как:

$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. Как я могу идти о выполнении этого типа преобразования динамически (там может также быть клиентомC в первом наборе данных)?
  2. Каково название этого типа трансформации (может быть, раздел)?

Я мог бы создать желаемый набор результатов программно, но я хотел бы использовать больше инструкций в стиле запросов в Powershell при работе с наборами данных.

+0

Я не уверен, что вы имеете в виду инструкции в стиле запроса .. Вы должны исправить это «программным» AFAIK –

+0

К сожалению, слово я имел в виду использовать был «процедурным». Я хотел бы избежать использования циклов для создания новых объектов и попытаться использовать selects, groups, join и т. Д. Больше sql-стиля с тех пор, как я работал с набором данных. – Zabalba

ответ

1

Группировать по свойствам, которые идентифицируют группу, а затем добавить столбцы, перейдя через члены группы. Пример:

$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 

Выход:

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

Благодарим вас за ответ. Это именно то, что я искал. – Zabalba