我正在努力寻找一种巧妙的方法将分隔的字符串转换为哈希表。例如,给出字符串:
UK_Kent_Margate
我想将其转换为PowerShell HashTable,如下所示:
$result = @{
UK = @{
Kent = @{
Margate = @{}
}
}
}
所以我可以使用'_'字符上的拆分轻松地将字符串分解为数组,但后来我正在努力(读卡住!)测试并在结果哈希中声明每个嵌套的哈希值。我想我需要一个没有问题的递归函数,但是我无法理解如何在结果哈希中测试正确的级别。
由于我正在编写的应用程序可能有任意数量的'_'因此嵌套我需要想出一个光滑的方法来做这个,我想不出怎么做。
之前有没有人遇到这样的事情并有任何建议?
答案 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[$_];
}
}