2014-02-21 100 views
0

我想要做的是動態創建數組變量名稱,然後用循環,基於哈希表值相等將該對象添加到其相關數組計數器變量。創建動態變量數組名稱,然後將對象添加到它們

$hshSite = @{} # Values like this CO,1 NE,2 IA,3 

$counter = $hshSite.count 

For($i = $counter; $i -gt 0; $i--) { 
New-Variable -Name "arr$i" -Value @() 
} 

如果$計數= 3,我想創建數組$ ARR1,$ ARR2,$ ARR3

$csv = Import-CSV.... 

ForEach ($x in $csv) { 
    #if $hshSite.Name = $x.location (ie CO), look up hash value (1), 
    and add the object to $arr1. If $hshSite.Name = NE, add to $arr2 

我試圖創建與新變量的動態數組,但有嘗試添加到問題那些陣列。是否可以將2個變量名稱連接成單個變量名稱?因此,以$ arr + $ i形成$ arr1和$ arr2和$ arr3,然後我基本上可以做$ arr0 + = $ _

最終目標是根據CO,NE,IA進一步分類/分組/處理。我願意接受其他想法來實現這一目標。謝謝你的幫助!

回答

3

只是讓你的哈希表值的陣列,並直接累積值,對他們說:

$Sites = 'CO','NE','IA' 
$hshSite = @{} 
Foreach ($Site in $Sites){$hshSite[$Site] = @()} 

ForEach ($x in $csv) 
{ 
    $hshSite[$x.location] += <whatever it is your adding> 
} 

如果有很多條目的CSV,你可以考慮作爲的ArrayList,而不是陣列創建這些值。

$Sites = 'CO','NE','IA' 
$hshSite = @{} 
Foreach ($Site in $Sites){ $hshSite[$Site] = New-Object Collections.Arraylist } 

ForEach ($x in $csv) 
{ 
    $hshSite[$x.location].add('<whatever it is your adding>') > $nul 
} 
+0

太棒了!是的,CSV確實有很多記錄。你能簡單地解釋一下使用數組列表而不是數組的好處嗎?再次感謝你的幫助!!! – cluckinchicken

+0

這是與內部處理數組有關的性能問題。你不能真的添加到數組中。 + =操作所做的是創建一個由原始數組的元素和新元素組成的全新數組。這會產生很多過程開銷。數組列表不會這樣做,因此每個操作只需幾個ms。只要只有幾個條目,性能差異就很小,不值得放棄陣列方法提供的更簡單更有效的編碼。當你開始做很多事情時,差異會變得很大。 – mjolinor

2

您可以很容易地使用Get-Variable cmdlet將項添加到動態命名的數組變量。類似於以下:

$MyArrayVariable123 = @() 
$VariableNamePrefix = "MyArrayVariable" 
$VariableNameNumber = "123" 

$DynamicallyRetrievedVariable = Get-Variable -Name ($VariableNamePrefix + $VariableNameNumber) 
$DynamicallyRetrievedVariable.Value += "added item" 

運行上面的代碼後,將$MyArrayVariable123變量將是一個列保持所述單個串added item

相關問題