2014-06-27 91 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 
}