2014-02-21 4 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> 
} 

를 항목의 많은, 당신은 arraylists 대신 배열로 그 값을 만드는 것이 좋습니다 수있는 CSV에 있다면.

$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

Brilliant! 예, CSV에는 많은 기록이 있습니다. 배열이 아닌 배열 목록을 사용할 때의 이점에 대해 간략하게 설명 할 수 있습니까? 도와 주셔서 다시 한번 감사드립니다 !!! – cluckinchicken

+0

배열이 내부적으로 처리되는 방법과 관련된 성능 문제입니다. 배열에 실제로 추가 할 수는 없습니다. + = 연산이 수행하는 작업은 원래 배열의 요소와 새 요소로 구성된 새로운 배열을 만드는 것입니다. 이로 인해 많은 프로세스 오버 헤드가 발생합니다. 배열 목록은 그렇게하지 않으므로 작업 당 몇 ms 더 빠릅니다. 단지 약간의 엔트리 만 있다면, 성능 차이는 간단하며, 배열 메소드가 제공하는 더 간단한 코딩을 포기할 가치가 없습니다. 당신이 많은 일을 시작할 때 그 차이는 상당히 커지게됩니다. – mjolinor

2

Get-Variable cmdlet을 사용하면 동적으로 명명 된 배열 변수에 항목을 쉽게 추가 할 수 있습니다. $MyArrayVariable123 변수가 하나의 문자열 added item을 들고 배열 될 것이다

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

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

위의 코드를 실행 한 후 : 다음과 유사합니다.