programing

해시 테이블을 문자열 배열로 변환하는 중

muds 2023. 9. 8. 21:48
반응형

해시 테이블을 문자열 배열로 변환하는 중

해시 테이블을 문자열 배열로 변환하려면 어떻게 해야 합니까?$l_table이 해시 테이블이라고 가정합니다.노력하면

$l_array = $l_table | format-table

$l_array는 배열이지만 "FormatEntryData" 개체의 배열입니다.하게되면

[string[]]$l_array = $l_table | format-table

$l_array는 문자열의 배열이지만 문자열은 모두 "Microsoft"입니다.파워쉘.명령어.내부의.포맷.FormatEntryData".노력하면

$l_array = $l_table | out-string

그러면 $l_array는 하나의 문자열입니다.저는 다른 많은 것들을 시도했지만, 수동으로 순환하는 것 외에는 아무 것도 작동하지 않습니다. 정말로 하고 싶지 않은 것이죠.

데이비드 1세. McIntosh의 자체 답변은 잘 작동하지만, 결과 배열의 요소는 기본 출력의 모든 라인에 해당하며, 여기에는 다음이 포함됩니다.

  • 빈 선행 및 후행선
  • 두 머리글 행(열 이름이 있는 행 및 구분 행)

Out-String콘솔(단말기)에서 일반적으로 볼 수 있는 것을 문자열로 보내기만 하면 기본적으로 하나의 문자열로 보낼 수 있습니다.-Stream줄(줄)의 배열로

헤더와 빈 행을 모두 제거하는 David의 명령어 변형은 다음과 같습니다.

[string[]] $l_array = ($l_table | Out-String -Stream) -ne '' | select -Skip 2

이 답변의 나머지 부분에서는 PS v3+ 구문과 내장 별칭을 사용하여 얻은 문자열 표현의 세부 사항을 제어하는 방법보여 줍니다.%위해서ForEach-Object간결하게

참고: 명확한 설명을 위해 샘플 입력 해시 테이블을 다음과 같이 부릅니다.$ht(아니오)$l_table) 다음 예에서 PSv4+.ForEach()변형이 더 잘 수행됩니다.

  • 모든 키를 문자열 배열로 가져옵니다.

      [string[]] $ht.Keys 
    
  • 모든 값을 문자열 배열로 가져옵니다.

      [string[]] $ht.Values
    
  • 키-값 쌍의 사용자 정의 표현을 형식으로 가져옵니다.<key>=<value>; 라는 점에 주목합니다..GetEnumerator()파이프라인을 통해 키-값 을 개별적으로 전송하는 데 필요합니다. 기본적으로 PowerShell은 해시 테이블을 전체적으로 전달합니다.

      $ht.GetEnumerator() | % { "$($_.Name)=$($_.Value)" }
    
      # or (PSv4+):
      $ht.GetEnumerator().ForEach({ "$($_.Name)=$($_.Value)" })
    

참고할 것은.[string]/[string[]]cast, 문자열 보간 중에도 암시적으로 적용됩니다(inside"...", 확장 가능한 문자열), 프리미티브와 잘 작동합니다.NET 유형(다음과 같은 추가 숫자 유형 포함)[decimal]그리고.[bigint]); 일반적으로 활자는 자신의 전체 활자 이름을 인쇄할 뿐입니다. 단, 활자가 인쇄되지는 않습니다..ToString()메서드는 보다 의미 있는 사용자 지정 표현(Primitive type이 수행하는 작업이며 PowerShell cmdlet에 의해 반환되는 일부 비Primitive type의 경우)을 반환하도록 명시적으로 재정의되었습니다.

또한 확장 가능한 문자열 내부에 배열(유사 데이터 구조)을 사용하면 해당 문자열의 요소가 연결된 (문자열화된) 요소로 확장됩니다.$OFS기본 설정 변수로 공백 문자가 기본 설정됩니다. (예:$a='one', 'two'; "$a"까지 확장.'one two'; 즉, 다음과 같은 것입니다."$([string[]] $a -join ' ')"- PowerShell에서 확장 가능한 문자열( 문자열 보간)에 대한 자세한 내용은 이 답변을 참조하십시오.

문자열에 나타낼 값의 속성을 선택하는 간단한 예:

# Sample hashtable containing a value of a non-built-in type,
# [System.Diagnostics.Process]    
$ht = @{ one = 1; two = Get-Process -ID $PID }

# Use the `.Path` property to represent the value.
$ht.GetEnumerator() | % { "$($_.Name)=$($_.Value.Path)" }
[string[]]$l_array = $l_table | out-string -stream

해시는 해시 테이블에 불과하므로 키와 값 속성이 있습니다.

$hash = @{}

$hash["foo"] = "bob"

$hash.Values

$hash.Values | Out-string

열거자를 가져오려면 키 값 쌍을 반환합니다.

$hash.GetEnumerator() |%{$_ | out-string}

원래 포스터는 Format-Table의 출력에 해당하는 문자열 배열을 원했을 수도 있지만, 제공된 시도와 포스터 자체의 답변/댓글이 시사하는 바와 같이 질문 제목의 문구는 해시 테이블 자체를 각 항목의 값 배열로 변환하려는 사용자에게 더 전형적입니다(변환됨).String아직 A까지는 아니더라도String이 문제에 대한 해결책을 찾고 있는 사람들을 위해 저는 다음을 제시합니다. (아직까지 비슷한 질문이 없는 것 같기 때문에)-

단순한 답은 다음과 같은 것입니다.

[string[]]$l_table.values

원하는 대로 문자열을 배열할 수 있습니다.

참고:$l_table.values[System.Collections.Hashtable+ValueCollection]그게 바로 그 이유입니다.[string[]]값이 이미 문자열인 경우에도 필요합니다.예를들면,

'Found {0} with submatch {1}' -f [string[]]$matches.values

그것이 없으면 작동하지 않습니다. (또 다른 가능한 문제는 다음에 언급됩니다.

의 가장 큰 결점은$l_table.values즉, 해시 테이블이 다음과 같이 정의되지 않는 한[ordered](PSV3+), 항목의 순서는 정의되지 않았습니다(해시 테이블이 수정됨에 따라 변경될 수 있습니다).해시 테이블을 배열로 변환할 때 해당 배열의 요소 순서를 일정하게 지정해야 하는 경우가 많습니다.실제로 키가 (양의) 정수인 경우가 있으며 결과 배열이 배열 인덱스와 동일한 값을 사용하는 것이 목적입니다( 참조).$matches위의 예).이 유형의 배열을 만들려면

[string[]]$l_table[($l_table.keys | sort)]

또는 값이 이미 문자열인 경우에는

$l_table[($l_table.keys | sort)]

파워셸의 컬렉션 슬라이싱 기능을 호출합니다. (단일 식을 통해 배열 식을 인덱스로 사용하여 독립적으로 선택된 컬렉션 항목의 배열을 생성할 수 있습니다. 예를 들어,$array[1,3,5,9],$array[1,2,3,4,5]아니면$array[1..5]키가 0에서 시작하는 연속 범위를 형성하는 경우에만 인덱스로 키가 있는 배열을 생성합니다.그러나 인덱싱 표현식은 파이프라인이므로 필요한 키 배열로 무엇이든 얻을 수 있습니다.(문자열이 아닌 값의) '희소' 해시 테이블에서 결과 배열을 사용합니다.

[string[]]$l_table[0..($l_table.keys | sort -descending)[0]]
#
# ($l_table.keys | sort -descending) produces a sorted array of key values
# with the largest value in element 0
#

이제 결과 배열은 개입(사용되지 않는) 배열 항목을 ""(즉, ")로 설정함으로써 적절한 인덱스 값에 정확하게 해당하는 정수 키를 갖게 됩니다.[string]$null문제가 있는 경우 2단계 프로세스를 사용하여 '누락' 항목을 다음과 같이 둘 수 있습니다.$null. 먼저, 한 번에 하나의 사전 쌍을 새로 만들어서 항목을 추가하지 않고 문자열이 아닌 해시 테이블을 문자열로 변환합니다(사용).GetEnumerator()). 둘째, 사용하지 않습니다.[string[]]떠나기 위하여$null(현재 문자열) 해시 테이블을 다음과 같이 배열로 변환할 때 'synch' 항목에서

($l_table.getenumerator() | foreach -begin {$str_table = @{}} -process {$str_table.add($_.key,[string]$_.value)} -end {$str_table[0..($str_table.keys | sort -descending)[0]]})

또는 보다 효율적으로 (비용이 많이 드는 잠재적인 유형을 제거함으로써)

($l_table.getenumerator() | foreach -begin {$maxkey = 0; $str_table = @{}} -process {$str_table.add($_.key,[string]$_.value); if ($maxkey -lt $_.key){$maxkey = $_.key}} -end {$str_table[0..$maxkey]})

참고: 문자열 값의 희소 해시 테이블의 경우 변환하지 않은 초기 형식

$l_table[0..($l_table.keys | sort -descending)[0]]

효과는 있지만 사용.[string[]]에서 누락된 항목을 변경합니다.$null로.""원하신다면

이것은 일반적인 문제입니다. 해시 테이블은 키 또는 값으로 검색해야 하지만 쌍의 집합을 얻을 수 없습니다. 이것이 결국 원래 해시 테이블입니다.예를 들어 해시 테이블은 "사전"으로 표시됩니다(VBS :-에서 기억하실 수 있습니다).그러나 키 & 값을 구분할 구분 기호를 결정해야 합니다(이 경우 "Key<->Value").

$ARRAY = ( $DICT.Keys | foreach-object { "$_<->$($DICT[$_])"})

원한다면 키를 먼저 정렬할 수도 있습니다.이 경우 Value<---> Key로 반전하여 값별로 정렬하였습니다.좀 더 장황하지만 가독성 있게 하기 위해 줄을 조금 더 넓혔습니다.

$ARRAY = ( $DICT.Keys | foreach-object { $DICT[$_] + "<--->" + $_} | sort-object)

언급URL : https://stackoverflow.com/questions/21413483/converting-hashtable-to-array-of-strings

반응형