2012-01-06 57 views
1

我有一個文件,其中,其中作爲存儲組件基線和組件名稱如下如何使用powershell從文件構建哈希表?

([email protected]\My_PVOB) [email protected]\My_PVOB 
([email protected]\My_PVOB) [email protected]\MY_PVOB 

其實我需要構造可能有像

@(Key=Mailcomp,Value=BL_2.1.0.9.5179) 
@(Key=OfficeComp, Value=BL_2.1.0.17.6972) 

我試圖取代像條目的哈希表如下

(Get-Content $BaselineFile) | foreach{ $_ -replace "@\My_PVOB[?]",''} | Out-File $BaselineFile 

然後我試着創建哈希表,但第一個命令本身失敗,我不知道如何創建哈希ta從文件條目中刪除。有人能幫助我嗎?

回答

2

在寫作的時候有兩個答案(一個來自吉文Levy和一個從jon Z),儘管事實上Shay的回答已經被接受(!),但兩者都很接近,但都不是很正確。這裏的原因:

與吉文的代碼問題

吉文的回答是太乏味了,基於指定創建這個「可能有這樣的條目哈希表」的不準確陳述要求:

@(Key=Mailcomp,Value=BL_2.1.0.9.5179) 
@(Key=OfficeComp, Value=BL_2.1.0.17.6972) 

但是,如果有人打算使用PowerShell語法,則說明不正確。在現實中,要求應該是這樣的:

​​

也就是說,第一行指定哈希的Mailcomp關鍵和哈希值BL_2.1.0.9.5179。的吉文的這段代碼修改後的版本提供了恰恰是:

$hash = @{} 
Get-Content $BaselineFile | 
Foreach-Object { 
    if ($_ -match '^\(([^@]+).+\)\s([^@]+)') 
    { 
     $hash[$matches[1]]=$matches[2] 
    } 
} 

下面是輸出:

Name  Value 
----  ----- 
Mailcomp BL_2.1.0.9.5179 
OfficeComp BL_2.1.0.17.6972 

這是很容易的工作,因爲我現在可以訪問$hash["Mailcomp"]$hash["OfficeComp"]檢索它們各自的值。

Shay的代碼的第二個問題是哈希條目創建本身(@{ key=$matches[1]; value=$matches[2] })。該語句爲每次迭代(即輸入的每一行)創建一個單獨的「小」散列表。它只有似乎由於其代碼中隱式寫入輸出的合併而產生合理的輸出。爲了證明這一點 - 和蘋果比較蘋果 - 採取我上面的代碼,並與此等同於吉文的代碼代替條件:

if ($_ -match '^\(([^@]+).+\)\s([^@]+)') 
    { 
     @{ $matches[1]=$matches[2] } 
    } 

你會發現,$hash["Mailcomp"]返回預期BL_2.1.0.9.5179

與喬恩的代碼

我喜歡喬恩個Z回答的問題;我真的這樣做。真。但它讓我想起了這句偉大的笑話assume we have a can opener...這是一個非常好的解決方案,當且僅當輸入適合一個簡單的分隔符。這裏不是這種情況 - 需要使用正則表達式(或其他機制)來處理輸入。平心而論,喬恩明確表示他正在進行一些預處理。 「Nuff說。

+0

我會驗證並做必要的修改,接受最佳答案 – Samselvaprabu 2012-01-10 03:13:49

2

假設你的$ baselinefile看起來像這樣預處理後:

Mailcomp BL_2.1.0.9.5179 
OfficeComp BL_2.1.0.17.6972 

這應該工作:

$hash = @{} 
Import-Csv $BaseLineFile -header "first", "second" -delimiter " " | ForEach-Object { $hash[$_.first] = $_.second} 
$hash 
+0

謝謝老兄。這是一個工作和有用的信息。 – Samselvaprabu 2012-01-06 12:28:52

2

試試這個:

Get-Content $BaselineFile | Foreach-Object { 
    if($_ -match '^\(([^@]+).+\)\s([^@]+)') 
    { 
     @{ 
      key=$matches[1] 
      value=$matches[2] 
     } 
    } 
} 

Name Value 
---- ----- 
value BL_2.1.0.9.5179 
key  Mailcomp 
value BL_2.1.0.17.6972 
key  OfficeComp 

或者

Get-Content $BaselineFile | Foreach-Object { 

    $value = ($_ -replace '@\\My_PVOB|\(|\)').split() 

    @{ 
     key=$value[0] 
     value=$value[1] 
    } 
} 

UPDATE:創建一個哈希表,哈希鍵由第一場比賽中,它的值是第二場比賽:

$ht = @{} 

Get-Content $BaselineFile | Foreach-Object {  

    if($_ -match '^\(([^@]+).+\)\s([^@]+)') 
    {   
      $ht[$matches[1]] = $matches[2]  
    }  
} 

$ht 

Name  Value   
----  -----   
Mailcomp BL_2.1.0.9.5179 
OfficeComp BL_2.1.0.17.6972 
+0

利維的易於理解的答案再次搖擺不定。它的作品好友,也可以理解 – Samselvaprabu 2012-01-06 12:27:29

+0

謝謝@Samselvaprabu :) – 2012-01-06 12:35:34

+0

這是未命名的哈希。如何將其存儲在命名的散列?因此,我可以在散列中處理每個值並執行一個更多的操作 – Samselvaprabu 2012-01-06 12:50:46