在PowerShell中对哈希表中的多个值进行排序

3

我在PowerShell中有一个哈希表,看起来像这样:

Profil = @{
"Jason" = "P2, P4, P1";
"Mick" = "P1";
"Rocky" = "P4, P5";
"Natasha" = "P9, P4, P1"
}

我需要去除空格并按以下方式排序:
Profil = @{
"Jason" = "P1,P2,P4";
"Mick" = "P1";
"Rocky" = "P4,P5";
"Natasha" = "P1,P4,P9"
}

我尝试使用 foreach($value in $Profil.GetEnumerator() | Sort Value) {$value.Value} 但不起作用。
3个回答

3
$Profil = @{
    "Jason" = "P2, P4, P1"
    "Mick" = "P1"
    "Rocky" = "P4, P5"
    "Natasha" = "P9, P4, P1"
}

# Create an empty Hashtable with a capacity equal or greater than the number of
# elements in $Profil
$ProfilSorted = [Hashtable]::New($Profil.Count)

foreach ($KeyAndValue in $Profil.GetEnumerator())
{
    # RegEx split on a comma followed by whitespace.
    [String[]]$Value = $KeyAndValue.Value -split ',\s*' |
        Sort-Object

    # Convert $Value from array of Strings to single String joined by commas.
    [String]$Value = $Value -join ','

    $ProfilSorted.Add($KeyAndValue.Key, $Value)
}

$Profil = $ProfilSorted
$Profil

您可以考虑将该值存储为字符串数组 [String[]],而不是依赖于文本拼接。


谢谢您的评论!非常有帮助! - Snowung

2
以下使用 foreach 语句(我将$Profil替换为$hash,以避免与自动变量$PROFILE混淆)在原地更新哈希表。
foreach ($key in @($hash.Keys)) {
  $hash[$key] = ($hash[$key] -split ', *' | Sort-Object) -join ','
}

$hash # output the updated hash table
  • $hash.Keys 枚举哈希表中的键,以供循环使用。

    • 请注意周围的 @(...),这是必要的,可以有效地克隆 .Keys 集合,以便允许在循环内更新哈希表。
  • 循环内的 $hash[$key] 访问手头键的单个条目。

    • 请注意,PowerShell 还允许使用点符号 (.) 访问哈希表条目,就好像它们是属性一样,并且通常允许变量引用和表达式指定属性名称,因此 $hash.key 也可以工作。
  • -split ', *' 将现有条目值按逗号和零个或多个空格 (*) 拆分为标记。

  • | Sort-Object 对结果标记进行排序。

  • -join ',' 使用逗号作为分隔符将排序后的标记连接起来。


使用 管道 也是一种选择,但通常会更 (尽管在许多用例中可能并不重要):

@($hash.Keys) | ForEach-Object {$hash[$_]= ($hash[$_] -split ', *' | Sort-Object) -join ','}

2

这应该可以正常工作:

$newProfil = @{}
$Profil.GetEnumerator() | foreach {

    $newValue = (($_.Value -replace "\s","") -split ',' | Sort-Object) -join ','
    $newProfil.add($_.Key, $newValue)
}

$newProfil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接