按值对嵌套哈希表进行排序



我有一个这样的哈希数组:

$weeklyStats[$RecipientName][$weekNr][$total]

它是在一个循环中创建的:

$weeklyStats = @{}
$weekNr = get-date -UFormat %V
ForEach ($RecipientName in $MailTraffic.keys)  
{  
$weeklyStats[$RecipientName] = @{}
$weeklyStats[$RecipientName][$weekNr] = @{}
$weeklyStats[$RecipientName][$weekNr]['Total'] = 0
$weeklyStats[$RecipientName][$weekNr]['Sent'] = 0
$weeklyStats[$RecipientName][$weekNr]['Received'] = 0
foreach($item in $MailTraffic[$RecipientName].keys)  
{  
weeklyStats[$RecipientName][$weekNr]['Total'] =+ 1
if $MailTraffic[$RecipientName]['transaction'] == "Sent"
{
$weeklyStats[$RecipientName][$weekNr]['Sent'] =+ 1
}
else
{
$weeklyStats[$RecipientName][$weekNr]['Received'] =+ 1
}
}
}

我不知道如何在Powershell中"转储"变量,但以下是json:中的内容

{
"mike":  {
"11":  {
"Total":   411,
"Sent":     21,
"Received":390,
}
},
"peter":  {
"11":  {
"Total":   751,
"Sent":     51,
"Received":700,
}
},
"frank":  {
"11":  {
"Total":   620,
"Sent":     20,
"Received":600,
}
},
}

我想按$total的降序打印出键和值。如果哈希表只有一级深度,我只能找到如何做到这一点的例子。

预期输出为:

Name        Total       Received    Sent
-----       -----       -----       -----
peter       751         700         51
frank       620         600         20
mike        411         390         21      

通过引用内部哈希表的Keys属性进行排序,然后分配给新的[ordered]字典:

$sorted = [ordered]@{}
$stats.GetEnumerator() |Sort-Object {
# Sort by first key from each inner hashtable
$_.Value.Keys |Select -First 1
} -Descending |ForEach-Object {
# re-assign to our ordered dictionary
$sorted[$_.Key] = $_.Value
}

$sorted现在包含您的新排序词典

大多数PowerShell cmdlet都用于处理(流!([PSObject]类型(包括[PScustomerObject]类型(列表的输入和输出
(要了解差异,请参见PSObject、Hashtable和PSCustomObject之间的差异(
嵌套哈希表很难在PowerShell中维护和处理(另请参阅:PowerShell多维数组(,因为PowerShell针对流式传输进行了优化,而流式传输对于级联对象来说相当困难,因此我建议您将嵌套哈希表转换为(相当平坦的([PScustomerObject]列表,类似于:

$PSStats =
ForEach ($name in $Stats.Keys) {
ForEach ($weekNr in $_.Keys) {
ForEach ($total in $_.Keys) {
[pscustomobject]@{name = $name; weekNr = $weekNr; total = $total}
}
}
}

一旦您将其转换为PSCustomObject列表,您就可以轻松地对其进行排序显示结果:

$PSStats | Sort-Object Total

我只需要从哈希表中创建一个自定义对象,然后根据Title属性进行排序:

# Creation of $mailtraffic
$mailtraffic = @{'Mike' = @{'Total' = 411; 'Sent' = 21; 'Received' = 390};'Peter' = @{'Total' = 751; 'Sent' = 51; 'Received' = 700};'Frank' = @{'Total' = 620; 'Sent' = 20; 'Received' = 600}}
# Sorting Code
$mailtraffic.GetEnumerator() |
Select @{n='Name';e={$_.Key}},@{n='Total';e={$_.Value.Total}},@{n='Received';e={$_.Value.Received}},@{n='Sent';e={$_.Value.Sent}} |
Sort Total -Descending

最新更新