透视/转换包含值列表的PSObject?

时间:2015-09-17 15:20:59

标签: powershell

有一个分配了以下值的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
....

我想将它转换为数组,

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')

1 个答案:

答案 0 :(得分: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