我输入的数据如下:
Type Site Count
======================
Copper Site1 10
Copper Site1 7
Bronze Site1 3
Bronze Site1 9
Copper Site2 32
Copper Site2 1
Bronze Site2 3
Bronze Site2 13
我想要输出的是
Type Site Count
======================
Copper Site1 17
Bronze Site1 12
Copper Site2 33
Bronze Site2 16
我有以下代码:
Function getIndex($location)
{
for($j = 0; $j -lt $result.Count; $j++) {
if($result[$j].Location -contains "$location") {
$index=$j
break;
}
}
return $index
}
for ($i=0; $i -lt $outarray.length; $i++) {
$loc=$outarray[$i].Location
$pcount=$outarray[$i].'Count'
$ltype=$outarray[$i].'License Type'
if(!($result | where-object {$_.Location -eq "$loc"})) {
$result+=New-object psobject -property @{'Location' = $loc; 'Count' = $pcount; 'License Type' = $ltype}
} else {
$index=getIndex($loc)
$result[$index].'Count' = $result[$index].'Count' + $pcount
}
}
但是此代码生成的输出只包含一种类型和计数的错误计数。我尝试通过将其修改为如下所示来优化函数:
Function getIndex($location)
{
for($j = 0; $j -lt $result.Count; $j++) {
if($result[$j].Location -contains "$location" -and $result[$j].'License Type' -contains "$item.licensetype") {
$index=$j
break;
}
}
return $index
}
由于数组索引被计算为null,导致我的索引操作失败。我觉得我在这里错过了一些非常简单的东西,但我无法弄明白。任何帮助是极大的赞赏!谢谢!
答案 0 :(得分:2)
我使用Group-Object和Measure-Object来完成你想要的。首先按类型分组,并将变量分配给当前类型,以便稍后在自定义对象中使用。然后我按站点分组,对于每个站点,我得到计数的总和,并输出Type,Site和Sum作为自定义对象。我将您的测试数据设置为一个对象数组,就像您在帖子中一样。我将其命名为$Array
。
$array | group Type | %{
$Type = $_.Name
$_.group | group Site | %{
[pscustomobject]@{
Type=$Type
Site=$_.Name
Count=($_.Group|measure-object Count -sum).sum
}
}
}
这完全符合您的要求:
Type Site Count
---- ---- -----
Copper Site1 17
Copper Site2 33
Bronze Site1 12
Bronze Site2 16
答案 1 :(得分:0)
这应该有用。
$counts = Import-CSV "C:\Users\Public\Scripts\counts.csv"
$counts | Sort-Object Site, Type -Unique | Select-Object Type, Site, @{Name = 'Count'; Expression = { $obj=$_;($counts | Where-Object {(($obj.Type -eq $_.Type) -and ($obj.Site -eq $_.Site))} | Measure-Object Count -Sum).Sum } }