[powershell] PowerShell에서 한 줄씩 파일 읽기

PowerShell에서 한 줄씩 파일을 읽고 싶습니다. 특히 파일을 반복하고 루프의 변수에 각 행을 저장하고 행에서 일부 처리를 수행하고 싶습니다.

나는 Bash에 해당하는 것을 알고 있습니다.

while read line do
    if [[ $line =~ $regex ]]; then
          # work here
    fi
done < file.txt

PowerShell 루프에 대한 문서는 많지 않습니다.



답변

PowerShell 루프에 대한 문서는 많지 않습니다.

PowerShell의 루프에 문서가 풍부하고, 다음 도움말 항목을 체크 아웃 할 수 있습니다 : about_For, about_ForEach, about_Do, about_While.

foreach($line in Get-Content .\file.txt) {
    if($line -match $regex){
        # Work here
    }
}

문제에 대한 또 다른 관용적 PowerShell 솔루션은 텍스트 파일의 줄을 ForEach-Objectcmdlet 으로 파이프하는 것입니다 .

Get-Content .\file.txt | ForEach-Object {
    if($_ -match $regex){
        # Work here
    }
}

루프 내에서 일치하는 정규식 대신에 Where-Object관심있는 라인 만 필터링하기 위해 라인을 파이프 할 수 있습니다.

Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object {
    # Work here
}


답변

Get-Content성능이 좋지 않습니다. 한 번에 파일을 메모리로 읽어들이려고합니다.

C # (. NET) 파일 판독기는 각 줄을 하나씩 읽습니다.

최고의 공연

foreach($line in [System.IO.File]::ReadLines("C:\path\to\file.txt"))
{
       $line
}

또는 약간 덜 성능

[System.IO.File]::ReadLines("C:\path\to\file.txt") | ForEach-Object {
       $_
}

foreach진술은 약간 더 빠를 것입니다 ForEach-Object(자세한 내용은 아래 주석 참조).


답변

만능 스위치는 여기에서 잘 작동합니다.

'one
two
three' > file

$regex = '^t'

switch -regex -file file { 
  $regex { "line is $_" } 
}

산출:

line is two
line is three


답변