有一个分配了以下值的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')
答案 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