Вопрос:
У меня есть:
$report.gettype().name Object[] echo $report Item Average — ——- orange 0.294117647058824 orange -0.901960784313726 orange -0.901960784313726 grape 9.91335740072202 grape 0 pear 3.48736462093863 pear -0.0324909747292419 pear -0.0324909747292419 apple 12.1261261261261 apple -0.0045045045045045
Я хочу создать переменную $total (например, хеш-таблицу), которая содержит сумму столбца “Средний” для каждого элемента, например
echo $total orange -1.5097 grape 9.913 pear 3.423 apple 12.116
Прямо сейчас я собираюсь перебирать отчет $, но это ужасно, и я ищу что-то более элегантное, чем следующая стартовая точка (неполная):
$tmpPrev = «» foreach($r in $report){ $tmp = $r.item $subtotal = 0 if($tmp <> $tmpPrev){ $subtotal += $r.average }
Как я могу это сделать?
Ответ №1
Командлеты Групповой объект и Мера-объект помогают решить задачу в режиме PowerShell-ish
код:
# Demo input $report = @( New-Object psobject -Property @{ Item = ‘orange’; Average = 1 } New-Object psobject -Property @{ Item = ‘orange’; Average = 2 } New-Object psobject -Property @{ Item = ‘grape’; Average = 3 } New-Object psobject -Property @{ Item = ‘grape’; Average = 4 } ) # Process: group by ‘Item’ then sum ‘Average’ for each group # and create output objects on the fly $report | Group-Object Item | %{ New-Object psobject -Property @{ Item = $_.Name Sum = ($_.Group | Measure-Object Average -Sum).Sum } }
Вывод:
Sum Item — —- 3 orange 7 grape Ответ №2
У меня есть больше командной строки.
Учитывая $report
$groupreport = $report | Group-Object -Property item -AsHashTable
является
Name Value —- —— grape {@{Item=grape; Average=9.91335740072202}, @{Item=grape; Average=0}} orange {@{Item=orange; Average=0.294117647058824}, @{Item=orange; Average=-0.901960784313726… apple {@{Item=apple; Average=12.1261261261261}, @{Item=apple; Average=-0.0045045045045045}} pear {@{Item=pear; Average=3.48736462093863}, @{Item=pear; Average=-0.0324909747292419}, @…
затем
$tab=@{} $groupreport.keys | % {$tab += @{$_ = ($groupreport[$_] | measure-object -Property average -sum)}}
дает
PS> $tab[«grape»] Count : 2 Average : Sum : 9,91335740072202 Maximum : Minimum : Property : Average PS> $tab[«grape»].sum 9,91335740072202
Он кажется коротким и удобным.
Резюме
$groupreport = $report | Group-Object -Property item -AsHashTable $tab = @{} $groupreport.keys | % {$tab += @{$_ = ($groupreport[$_] | measure-object -Property average -sum)}} $tab.keys | % {write-host $_ `t $tab[$_].sum} Ответ №3
Я не знаю, можете ли вы избавиться от цикла. Как насчет:
$report | % {$averages = @{}} { if ($averages[$_.item]) { $averages[$_.item] += $_.average } else { $averages[$_.item] = $_.average } } {$averages}