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您是否可以更新您的问题以显示您是如何创建这个嵌套哈希表的?嗯,我是个白痴,因为涉及到一些私有数据,我简化了示例,不幸的是,这并不具有代表性,简单的列表也不行。我现在改正了。