如何在BAThell中将分隔的字符串转换为嵌套的哈希表?

时间:2014-01-10 15:12:35

标签: powershell hashtable

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

UK_Kent_Margate

我想将其转换为PowerShell HashTable,如下所示:

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

所以我可以使用'_'字符上的拆分轻松地将字符串分解为数组,但后来我正在努力(读卡住!)测试并在结果哈希中声明每个嵌套的哈希值。我想我需要一个没有问题的递归函数,但是我无法理解如何在结果哈希中测试正确的级别。

由于我正在编写的应用程序可能有任意数量的'_'因此嵌套我需要想出一个光滑的方法来做这个,我想不出怎么做。

之前有没有人遇到这样的事情并有任何建议?

3 个答案:

答案 0 :(得分:6)

这样的事,也许?

$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 = @{}

答案 1 :(得分: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                        {} 

答案 2 :(得分:0)

旧学校解决方案:

$input = @("UK_Kent_Margate");

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