Powershell 按值对嵌套哈希表排序

Powershell 按值对嵌套哈希表排序,powershell,Powershell,我有一个哈希数组: $weeklyStats[$RecipientName][$weekNr][$total] 这是在循环中创建的: $weeklyStats = @{} $weekNr = get-date -UFormat %V ForEach ($RecipientName in $MailTraffic.keys) { $weeklyStats[$RecipientName] = @{} $weeklyStats[$RecipientName][$weekNr

我有一个哈希数组:

$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]
类型)列表以进行输入和输出。
(要了解差异,请参见示例)。
在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

$stats
$name
$total
在这里包含了什么?这包括在我的问题中$stats是哈希表的名称,$name是字符串,weeknr和total是整数。我更希望看到控制台输出的
$stats
。要获得输出,我设想
$stats
$stats={Frank'={10={500='Frank,10500'},{Mike'={10={673='Mike,10673}}一样创建。我敢打赌那是不对的。所以我想看看它是如何创建的。要从
$stats[$name][$weekNr][$total]
中输出
Frank,10500
,必须有一个字符串,其中所有值都是静态设置的,因为两个示例的间距不一致,所以它不能作为插值输出。Tnx,不幸的是,我的示例是错误的:|当添加了一个附加级别时,我仍然无法应用您的示例。@Lunacy您是否可以更新您的问题以显示您是如何创建这个嵌套哈希表的?嗯,我是个白痴,因为涉及到一些私有数据,我简化了示例,不幸的是,这并不具有代表性,简单的列表也不行。我现在改正了。