2015-09-17 40 views
0

具有被分配了以下值的psobject,数据透视/转换包含值列表的PSObject?

echo "A|B|C|X,A|B|C|Y,A|B|C|Z,D|E|F|X,D|E|F|Y,D|E|F|Z 
1,3,5,2,3,7" > 'c:\temp\test.csv' 

$d = Import-Csv 'c:\temp\test.csv' 

$d | select -first 1 
 
A|B|C|X : 1 
A|B|C|Y : 3 
A|B|C|Z : 5 
D|E|F|X : 2 
D|E|F|Y : 3 
D|E|F|Z : 7 
.... 

我希望它被tranformed到阵列,

 
A,B,C,1,3,5 
D,E,F,2,3,7 
.... 
- - - - - - 
     X Y Z 

它是转动的psobject一个简洁的方式?转换函数头可以

function Convert($datarow, [string[]]$pivotCols) { ... } 
Convert($d, 'X','Y','Z') 

回答

0

其实这是一个罕见的情况下$d是一个PSObject不给你任何好处之一。这里有一个你如何能够实现你想要的例子,虽然我不确定它是最简洁的方式:

# Transforming input. 
$sInput = "A|B|C|X,A|B|C|Y,A|B|C|Z,D|E|F|X,D|E|F|Y,D|E|F|Z 
1,3,5,2,3,7" 
$sRawNames, $sRawValues = $sInput -split ([System.Environment]::NewLine) 
$cRawNames = $sRawNames -split ',' 
$cRawValues = $sRawValues -split ',' 

# Grouping fields by name pattern. 
$sGroupingPattern = '\|[XYZ]' 
$htGrouped = [Ordered]@{} 
for ($i = 0; $i -lt $cNames.Count; $i++) { 
    $sName = $cRawNames[$i] -replace $sGroupingPattern 
    try { 
     $htGrouped.Add($sName, @($cRawValues[$i])) 
    } 
    catch [ArgumentException] { 
     $htGrouped[$sName] += $cRawValues[$i] 
    } 
} 

# Formatting output. 
$cOutput = @() 
$htGrouped.GetEnumerator() | ForEach-Object { 
    $cValues = ($_.Name -split '\|') + $_.Value 
    $oValues = New-Object -TypeName PSObject 
    for ($i = 0; $i -lt $cValues.Count; $i++) {  
     $oValues | Add-Member -MemberType "NoteProperty" -Name $i -Value $cValues[$i] 
    } 
    $cOutput += $oValues 
} 

$cOutput | Format-Table