파워셸 다차원 배열
다음과 같은 다른 언어로 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
'programing' 카테고리의 다른 글
PowerShell에서 설정(데이터 구조) (0) | 2023.10.22 |
---|---|
JNI - "'jni_md' 포함 파일을 열 수 없습니다.h'" (0) | 2023.10.17 |
Sequelize로 MariaDB에 값 'null'을 삽입하는 방법? (0) | 2023.10.17 |
CSS 두 디브가 서로 옆에 있음 (0) | 2023.10.17 |
C에서 (char)0과 '\0'의 차이점은 무엇입니까? (0) | 2023.10.17 |