programing

파워셸 다차원 배열

yellowcard 2023. 10. 17. 20:10
반응형

파워셸 다차원 배열

다음과 같은 다른 언어로 Array를 수행하는 방법이 있습니다.

$x = "David"
$arr = @()

$arr[$x]["TSHIRTS"]["SIZE"] = "M"

오류가 발생합니다.

연관 배열(해시)을 작성하려고 합니다.다음 명령 순서를 사용해 보십시오.

$arr=@{}
$arr["david"] = @{}
$arr["david"]["TSHIRTS"] = @{}    
$arr["david"]["TSHIRTS"]["SIZE"] ="M"
$arr.david.tshirts.size

해시와 배열 간의 차이를 기록합니다.

$a = @{} # hash
$a = @() # array

배열은 음수가 아닌 정수만 인덱스로 사용할 수 있습니다.

powershell.com 에서:

PowerShell은 들쭉날쭉한 어레이와 진정한 다차원 어레이의 두 가지 유형을 지원합니다.

들쭉날쭉한 어레이는 어레이를 요소로 저장하는 일반적인 PowerShell 어레이입니다.이 스토리지는 치수가 다를 수 있기 때문에 매우 비용 효율적입니다.

$array1 = 1,2,(1,2,3),3
$array1[0]
$array1[1]
$array1[2]
$array1[2][0]
$array1[2][1]

실제 다차원 배열은 항상 정사각형 행렬과 유사합니다.이러한 배열을 만들려면 에 액세스해야 합니다.NET. 다음 줄은 10x20 행렬과 유사한 10개와 20개의 요소로 구성된 2차원 배열을 만듭니다.

$array2 = New-Object 'object[,]' 10,20
$array2[4,8] = 'Hello'
$array2[9,16] = 'Test'
$array2

3차원 배열 10*20*10의 경우

$array3 = New-Object 'object[,,]' 10,20,10

manojlds가 위에서 말한 것을 확장하면 해시테이블을 둥지로 만들 수 있습니다.실제 다차원 배열은 아닐 수도 있지만 데이터를 구조화하는 방법에 대한 몇 가지 아이디어를 제공합니다.예:

$hash = @{}

$computers | %{
    $hash.Add(($_.Name),(@{
        "Status" = ($_.Status)
        "Date"   = ($_.Date)
    }))
}

멋진 점은 다음과 같은 것을 참조할 수 있다는 것입니다.

($hash."Name1").Status

또한 물건을 찾기 위한 배열보다 훨씬 빠릅니다.배열에서 매칭을 사용하기 보다는 데이터를 비교하기 위해 사용합니다.

$hash.ContainsKey("Name1")

PowerShell은 개체를 cmdlet 사이에 연결한다는 것을 알고 있으므로, PSCustomObject 배열을 사용하는 것이 PowerShell에서 더 일반적입니다.

$arr = @(
    [PSCustomObject]@{Name = 'David';  Article = 'TShirt'; Size = 'M'}
    [PSCustomObject]@{Name = 'Eduard'; Article = 'Trouwsers'; Size = 'S'}
)

또는 이전 PowerShell 버전(PSV2)의 경우:

$arr = @(
    New-Object PSObject -Property @{Name = 'David';  Article = 'TShirt'; Size = 'M'}
    New-Object PSObject -Property @{Name = 'Eduard'; Article = 'Trouwsers'; Size = 'S'}
)

선택한 항목을 다음과 같이 선택합니다.

$arr | Where {$_.Name -eq 'David' -and $_.Article -eq 'TShirt'} | Select Size

또는 새로운 PowerShell(Core) 버전의 경우:

$arr | Where Name -eq 'David' | Where Article -eq 'TShirt' | Select Size

또는(크기만 지정):

$arr.Where{$_.Name -eq 'David' -and $_.Article -eq 'TShirt'}.Size

부록 2020-07-13

구문 및 가독성

설명에 나와 있듯이 사용자 지정 개체의 배열을 사용하는 것이 더 간단하며 입력을 절약할 수 있습니다. 이를 더 소진하고 싶다면 (또는 ) cmdlet을 사용하여 배열을 만들 수도 있습니다.

$arr = ConvertFrom-Csv @'
Name,Article,Size
David,TShirt,M
Eduard,Trouwsers,S
'@

더 읽기 쉬운 항목:

$arr = ConvertFrom-Csv @'
Name,   Article,   Size
David,  TShirt,    M
Eduard, Trouwsers, S
'@

참고: 공백이나 특수 문자를 포함하는 값은 두 번 따옴표로 묶어야 합니다.

또는 고정 너비 테이블 형식을 읽는 외부 cmdlet을 사용합니다.

$arr = ConvertFrom-SourceTable '
Name   Article   Size
David  TShirt    M
Eduard Trouwsers S
'

인덱싱

사용자 지정 개체 배열을 사용할 경우 이진 검색 알고리즘을 사용하는 해시 테이블보다 느리다는 단점이 있습니다.
사용자 지정 객체 배열을 사용할 경우, 를 들어 사이즈가 M인 T 셔츠를 입은 모든 사람들을 쉽게 검색할 수 있다는 장점이 검색할 수 있는 장점이 있습니다.

$arr | Where Article -eq 'TShirt' | Where Size -eq 'M' | Select Name

객체 배열에서 이진 검색 색인을 작성하려면:

$h = @{}
$arr | ForEach-Object {
    If (!$h.ContainsKey($_.Name)) { $h[$_.Name] = @{} }
    If (!$h[$_.Name].ContainsKey($_.Article)) { $h[$_.Name][$_.Article] = @{} }
    $h[$_.Name][$_.Article] = $_ # Or: $h[$_.Name][$_.Article]['Size'] = $_.Size
}

$h.david.tshirt.size
M

참고: 에 존재하지 않는 해시 테이블 키를 참조하면 오류가 발생합니다.

Set-StrictMode -Version 2
$h.John.tshirt.size
PropertyNotFoundException: The property 'John' cannot be found on this object. Verify that the property exists.

여기 간단한 다차원 문자열 배열이 있습니다.

$psarray = @(
 ('Line' ,'One' ),
 ('Line' ,'Two')
)

foreach($item in $psarray)
{
    $item[0]
    $item[1]
}

출력:

Line
One
Line
Two

파워셸의 다차원 배열에 추가하는 방법에 대한 또 다른 스레드가 여기에 있습니다.이 방법을 사용하지 말아야 할 이유가 있을지 모르겠지만, 제 목적에 맞게 효과가 있었습니다.

$array = @()
$array += ,@( "1", "test1","a" )
$array += ,@( "2", "test2", "b" )
$array += ,@( "3", "test3", "c" )

2차원 어레이도 들쭉날쭉한 어레이로 정의할 수 있습니다.

$array =  New-Object system.Array[][] 5,5

이것은 좋은 특징을 가지고 있습니다.

$array[0]

1차원 배열을 출력합니다.$array[0][0].$array[0][4]. 상황에 따라 당신은 그것보다 그것을 선호할 수 있습니다.$array = New-Object 'object[,]' 5,5가 안 (위의 CB에 댓글을 달았을텐데 스택 오버플로가 아직 안됨)

사용할 수도 있습니다.System.Collections.ArrayList배열을 만들 수도 있고 원하는 것도 만들 수도 있습니다.다음은 예입니다.

$resultsArray= New-Object System.Collections.ArrayList 
[void] $resultsArray.Add(@(@('$hello'),2,0,0,0,0,0,0,1,1))
[void] $resultsArray.Add(@(@('$test', '$testagain'),3,0,0,1,0,0,0,1,2))
[void] $resultsArray.Add("ERROR")
[void] $resultsArray.Add(@(@('$var', '$result'),5,1,1,0,1,1,0,2,3))
[void] $resultsArray.Add(@(@('$num', '$number'),3,0,0,0,0,0,1,1,2))

한 가지 문제는, 문제라고 한다면, 제한을 둘 수 없다는 것입니다.또한, 사용해야 합니다.[void]안 그러면 대본이 화가 날 겁니다.

한 CB와 net 구문 사용(위에서 지적한 CB와 같이)
또한 '표형' 배열에 일관성을 더하게 됩니다.

배열을 정의하면...
그리고 당신은 다른 종류를 저장하려고 노력합니다.
파워셸은 당신에게 경고할 것입니다.

$a = New-Object 'byte[,]' 4,4
$a[0,0] = 111;    // OK
$a[0,1] = 1111;   // Error

물론 파워셸이 당신을 도와줄 겁니다
명백한 전환에 있어서:

$a = New-Object 'string[,]' 2,2
$a[0,0] = "1111";   // OK
$a[0,1] = 111;      // OK also

어레이를 배열로 만들기 위한 꽤 멋진 솔루션을 찾았습니다.

$GroupArray = @()
foreach ( $Array in $ArrayList ){
    $GroupArray += @($Array , $null)
}
$GroupArray = $GroupArray | Where-Object {$_ -ne $null}

위에서 대여:

$arr = ConvertFrom-Csv @'
Name,Article,Size
David,TShirt,M
Eduard,Trouwsers,S
'@

$arr 인쇄:

$arr

Name   Article   Size
----   -------   ----
David  TShirt    M
Eduard Trouwsers S

이제 'David'를 선택합니다.

$arr.Where({$_.Name -eq "david"})

Name  Article Size
----  ------- ----
David TShirt  M

이제 '데이비드'의 크기를 알고 싶다면,

$arr.Where({$_.Name -eq "david"}).size

M

언급URL : https://stackoverflow.com/questions/9397137/powershell-multidimensional-arrays

반응형