【问题标题】:Sort multiple values in hashtable in powershell在powershell中对哈希表中的多个值进行排序
【发布时间】:2019-01-29 22:47:56
【问题描述】:

我在 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} 但不起作用

【问题讨论】:

    标签: powershell sorting hashtable trim


    【解决方案1】:
    $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[]],而不是依赖文本拼接。

    【讨论】:

    • 感谢您的评论!很有帮助!
    【解决方案2】:

    这应该可行:

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

    【讨论】:

      【解决方案3】:

      以下更新哈希表使用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 ','}
      

      【讨论】:

        猜你喜欢
        • 2013-08-02
        • 1970-01-01
        • 2018-12-05
        • 1970-01-01
        • 2021-08-22
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        相关资源
        最近更新 更多