2014-06-27 36 views
3

给定一组键值对(例如通过ConvertFrom-StringData读入),是否有将其转换为Hashtable或类似的流水线方式以允许快速查找?即一种不需要我循环访问数组并自己手动构建散列表的方法。快速文件到PowerShell中的Hashtable

实例数据

10.0.0.1=alice.example.com 
10.0.0.2=bob.example.com 

用法示例

$names = gc .\data.txt | ConvertFrom-StringData 
// $names is now Object[] 
$map = ? 
// $map should now be Hashtable or equivalent 
echo $map['10.0.0.2'] 
// Output should be bob.example.com 

基本上我寻找的是一个,最好是,内置的文件到哈希表的功能。或者是一个数组到哈希表函数。


注:作为@mjolnior解释说,事实上,我的哈希表,但单一的价值的人组成的数组。所以这是通过读取文件-raw来解决的,因此不需要任何数组来进行哈希表转换。更新问题标题以符合该标题。

+0

所以,等待,我很困惑......这有什么错做你做了什么用'$ names',然后只是做'$ names.'10.0.0.2''来获得所需的输出? – TheMadTechnician

+0

@TheMadTechnician语法错误,因为$名称最终是一个单值哈希表的数组,而不是一个哈希表。 – Svish

回答

4

Convertfrom-StringData是不会创建一个哈希表。

你需要给它的键值对作为一个单一的多行字符串(而不是字符串数组)

$map = Get-Content -raw .\data.txt | ConvertFrom-StringData 

$map['10.0.0.2'] 

bob.example.com 

当您使用获取内容未经-raw开关,你给ConvertFrom-StringData是单行字符串数组,和它给你回单元素哈希表的数组:

$map = Get-Content .\data.txt | ConvertFrom-StringData 

$map.gettype() 

$Map[0].GetType() 

$map[0] 



IsPublic IsSerial Name          BaseType                 
-------- -------- ----          --------                 
True  True  Object[]         System.Array                
True  True  Hashtable        System.Object                

Key : 10.0.0.1 
Value : alice.example.com 
Name : 10.0.0.1 
+1

谢谢!这很有道理,完全有效:) – Svish

0

这个可能不是你要找的,但它避免了将整个事物转换为散列。

$content = @("10.0.0.1=alice.example.com","10.0.0.2=bob.example.com"); 
$content | ForEach-Object { 
    $keyval = $_.split("="); 
    if ($keyval[0] -eq "10.0.0.2") { 
     $keyval[1] 
    } 
} 

的输出将是对=的右侧的每个值,其中左侧匹配IP。

+0

对不起,没有。基本上,我所追求的就是如何从文件中获得第1行右侧的内容。在这里你已经将它硬编码到你的脚本中,但是我需要从文件中读取它。例如'ConvertFrom-StringData',我可以很容易地做到这一点,但问题是我最终得到了一个数组,并且我想要一个散列表,这样我就可以直接查找,而无需每次循环遍历它。 我当然可以通过自己的数组循环遍历数组,并构建表,但我认为这应该是一个非常普遍的事情,并希望已经通过内置的东西解决了。 – Svish

+0

我只硬编码它来简化我自己的测试。用'$ content = get-content。\ data.txt'替换那行,你会得到相同的数组。 – alroc

+0

哦!不知道创建哈希表和数组的语法如此相似,呵呵。我的错! – Svish

2

我通常做以下从键/值对的列表中创建一个哈希表:

$hash = @{} 
Get-Content 'C:\input.txt' | Where-Object { 
    $_ -like '*=*' 
} | ForEach-Object { 
    $key, $value = $_ -split '\s*=\s*', 2 
    $hash[$key] = $value 
}