source

각 줄의 텍스트 파일을 파워셸을 통해 배열로 저장하는 방법

manycodes 2023. 10. 18. 22:52
반응형

각 줄의 텍스트 파일을 파워셸을 통해 배열로 저장하는 방법

텍스트 파일이 있으면 C:\USER\Documents\Collection\collection.다음 정보를 가진 txt.

collectionA.json
collectionB.json
collectionC.json
collectionD.json

파워셸을 통해 텍스트 파일에 각 줄을 어떻게 배열의 요소로 저장할 수 있는지 궁금합니다.

array arrayFromFile = new Array;
foreach(line x in collection.txt)
{
    arrayFromFile.Add(x);
}

...다음을 목표로 하고 있습니다.

foreach(string x in arrayFromFile)
{
    newman run x;
}

보기에 쉬운 질문에 대해 사과드립니다. 저는 파워셸을 상대해 본 적이 없습니다.

Get-Content명령어는 텍스트 파일의 각 줄을 별도의 문자열로 반환하므로 배열을 제공합니다(사용하지 않는 한).-Rawparameter; 이는 모든 행이 하나의 문자열로 결합되도록 합니다.

[string[]]$arrayFromFile = Get-Content -Path 'C:\USER\Documents\Collections\collection.txt'

mklement0는 이 명령어를 호출할 때 실제로 무슨 일이 일어나고 있는지에 대해 훨씬 더 자세히 설명하고, 편리함보다 성능이 걱정되는 경우 대체 접근 방식을 제공합니다.만약 여러분이 단지 이 한 가지 요구 사항을 해결하는 것보다 언어에 대해 더 많이 배우고 싶다면 읽을 가치가 있습니다.

John Levan의 유용한 답변을 보완하기 위해:

Get-ContentGet-Contentcmdlet으로 개체파이프라인하나씩 출력합니다.(파이프 기호가 없는 상태에서 cmdlet을 호출하는 경우에도 파이프라인이 포함됩니다.|, 후자는 여러 명령을 연쇄하기 위해 필요합니다).
이 경우 출력 개체는 입력 텍스트 파일의 개별 줄입니다.

다음과 같은 변수에 할당하여 파이프라인의 출력 개체수집하는 경우$arrayFromFile또는 더 큰 표현의 맥락에서 파이프라인을 사용함으로써.(...):

  • PowerShell은 여러 출력 개체자동으로 생성유형배열 캡처합니다.[object[]],
  • 출력 개체가 하나뿐경우 해당 개체는 배열 래퍼 없이 그대로 캡처됩니다.

그러나 대부분의 경우 PowerShell은 문장에서 스칼라(컬렉션이 아닌 단일 값)를 어레이(컬렉션)와 동일하게 취급하거나, 파이프라인에 열거할 값을 출력할 때 cmdlet을 통해 처리하는 등 많은 맥락에서 어레이(컬렉션)를 항상 수신해야 할 필요가 없습니다.lowing 명령은 입력 파일에 포함된 줄 수에 관계없이 잘 작동합니다.

# OK - read all lines, then process them one by one in the loop.
# (No strict need to collect the Get-Content output in a variable first.)
foreach ($line in Get-Content C:\USER\Documents\Collections\collection.txt) {
  newman run $line
}

# Alternative, using the pipeline:
# Read line by line, and pass each through the pipeline, as it is being
# read, to the ForEach-Object cmdlet.
# Note the use of automatic variable $_ to refer to the line at hand.
Get-Content C:\USER\Documents\Collections\collection.txt |
  ForEach-Object { newman run $_ }

PowerShell은 명령어의 출력이 항상 배열임을 보장하기 위해 단일 객체 출력도 배열로 감싸는 array-sub expression 연산자 제공합니다.

따라서 PowerShell-diomatic 솔루션은 다음과 같습니다.

$arrayFromFile = @(Get-Content C:\USER\Documents\Collections\collection.txt)

MadTechnician은 에 대한 대안으로 파이프라인 출력을 캐스트/유형 제약하는 데 사용할 수도 있으며, 이를 통해 배열을 생성할 수도 있다고 지적합니다.

# Equivalent of the command above that additionally locks in the variable date type.
[array] $arrayFromFile = Get-Content C:\USER\Documents\Collections\collection.txt

사용함으로써[array] $arrayFromFile = ...보다는$arrayFromFile = [array] (...),변수$arrayFromFile는 유형 제한을 받게 되며, 이는 해당 데이터 유형이 잠겨 있음을 의미합니다(기본적으로 PowerShell에서는 언제든지 변수 유형을 변경할 수 있음).

[array]존의 답변에 사용된 유형별 캐스트에 대한 명령 독립적인 대안입니다.[string[]]; 후자를 사용하여 어레이의 요소 전체에 균일한 유형을 사용할 수도 있지만 PowerShell에서는[1] 이러한 유형을 사용할 필요가 없는 경우가 많습니다.

일반 PowerShell 어레이는 유형에 해당합니다.[object[]], 그것은 다른 유형의 요소들을 섞을 수 있게 해주지만, 어떤 주어진 요소는 여전히 특정한 유형을 가지고 있습니다; 예를 들어, 비록 유형이$arrayFromFile위의 명령어는 다음과 같습니다.[object[]], 의 $arrayFromFile[0], 예를 들어, 첫번째 요소는[string](파일에 행이 1개 이상 포함되어 있는지 assuming하고, 다음과 같이 유형을 확인합니다.$arrayFromFile[0].GetType().Name).


더 빠른 대안: 를 직접 사용합니다.NET 프레임워크

Cmdlet과 파이프라인은 표현력이 뛰어나고 편리하지만 속도가 느릴 수 있는 높은 수준의 메모리 저장 기능을 제공합니다.

성능이 중요할 때는 를 직접 사용합니다.이 경우와 같이 NET 프레임워크 유형이 필요합니다.

$arrayFromFile = [IO.File]::ReadAllLines('C:\USER\Documents\Collections\collection.txt')

어떻게 그 방법을 주목할 것인지.System.접두사는 형식 이름에서 생략할 수 있습니다.

  • 존의 대답처럼, 이것은 a를 돌려줄 것입니다.[string[]]배열해 놓은

  • 주의 사항:

    • 상대 경로를 주의해야 합니다.NET에는 일반적으로 PowerShell과 다른 현재 디렉토리가 있습니다. 이 문제를 해결하려면 가장 간단한 경우에는 항상 절대 경로를 통과해야 합니다."$PWD/collection.txt"그리고 가장 강력하게는
      "$((Get-Location -PSProvider FileSystem).ProviderPath)/collection.txt"

    • .NET의 기본 인코딩은 UTF-8인 반면 Windows PowerShell기본 인코딩은 "ANSI" 인코딩, 즉 시스템 로케일의 레거시 코드 페이지입니다. 반면에 PowerShell Core(v6+) 역시 UTF-8로 기본 설정됩니다.Get-Encoding-Encoding매개변수 또는 그.ReadAllLines()입력 파일의 문자 인코딩을 명시적으로 지정하기 위해 인코딩 인스턴스를 수락하는 오버로드입니다.


[1] 일반적으로 PowerShell의 암묵적인 런타임 유형 변환은 C#에서 얻을 수 있는 것과 같은 유형의 안전성을 제공할 수 없습니다.예.,[string[]] $a = 'one', 'two'; $a[0] = 42오류가 발생하지 않음: PowerShell은 단순히 조용히 변환합니다.[int] 42줄에 맞추어

$array = Get-Content -Path @("C:\tmp\sample.txt")
foreach($item in $array)
{
 write-host $item 
} 

언급URL : https://stackoverflow.com/questions/52170699/how-to-save-each-line-of-text-file-as-array-through-powershell

반응형