【问题标题】:How can I turn a delimited string into a nested hashtable in PowerShell?如何在 PowerShell 中将分隔字符串转换为嵌套哈希表?
【发布时间】:2014-01-29 15:07:25
【问题描述】:

我正在努力寻找一种巧妙的方法将分隔字符串转换为哈希表。例如给定字符串:

UK_Kent_Margate

我想把它变成如下所示的 PowerShell HashTable:

$result = @{
    UK = @{
        Kent = @{
            Margate = @{}
        }
    }
 }

因此,我可以使用“_”字符上的拆分轻松地将字符串分解为一个数组,但随后我在测试和声明结果散列中的每个嵌套散列时遇到了困难(读卡住了!)。我想我需要一个没问题的递归函数,但我无法弄清楚如何测试结果哈希中的正确级别。

由于我正在编写的应用程序可能有任意数量的“_”,因此我需要想出一个巧妙的方法来做到这一点,但我想不出该怎么做。

有没有人遇到过这样的事情并有什么建议?

【问题讨论】:

    标签: powershell hashtable


    【解决方案1】:

    可能是这样的吧?

    $string = 'UK_Kent_Margate'
    
    $result = @{}
    
    $Parts = $string.split('_') 
    0..($parts.count -1) |
    foreach {
              iex "`$result.$($parts[0..$_] -join '.') = @{}"
            }
    

    为了帮助您理解它的工作原理,只需删除 iex(invoke-expression),并让它输出它正在创建的执行字符串:

    $string = 'UK_Kent_Margate'
    
    $result = @{}
    
    $Parts = $string.split('_') 
    0..($parts.count -1) |
    foreach {
              "`$result.$($parts[0..$_] -join '.') = @{}"
            }
    
    $result.UK = @{}
    $result.UK.Kent = @{}
    $result.UK.Kent.Margate = @{}
    

    【讨论】:

    • 这对我来说太 Powershell 了。你能解释一下 foreach 行是如何工作的吗?
    • 更新了答案。这有帮助吗?
    • 绝对 - 我不知道 PS 中带有哈希表的这种语法。 +1。
    • @mjolinor - 这太棒了,正是我遇到的问题。如果没有大量代码,我无法弄清楚如何嵌套不同的元素——这是非常动态的。 +1。
    【解决方案2】:

    一个老派的解决方案:

    $input = @("UK_Kent_Margate");
    
    $result = @{};
    $input | foreach {
      $keys = $_ -split "_";
      $hs = $result;
      $keys | foreach {
        $hs[$_] = @{};
        $hs = $hs[$_];  
      }
    }
    

    【讨论】:

      【解决方案3】:

      您需要做的事情是反向做事,而不是递归。拆分为一个数组,然后在构建嵌套哈希表之前反转数组:

      $s = "UK_Kent_Margate"
      $t = $s -split '_'
      [array]::Reverse($t)
      [hashtable]$result = @{}
      foreach ($w in $t) { $result = @{ $w = $result } }
      $result
      
      Name                           Value                                           
      ----                           -----                                           
      UK                             {Kent}                                          
      
      $result.UK.Kent
      
      Name                           Value                                           
      ----                           -----                                           
      Margate                        {} 
      

      【讨论】:

      • 非常好。我喜欢!
      • 我期待一些“逆向”解决方案,但从来没有想出比我所拥有的更好的东西。 +1。
      猜你喜欢
      • 2021-12-30
      • 2011-02-11
      • 2018-11-08
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      相关资源
      最近更新 更多