IT

PowerShell에서 한 줄씩 파일 읽기

itgroup 2023. 4. 18. 22:28
반응형

PowerShell에서 한 줄씩 파일 읽기

PowerShell에서 파일을 한 줄씩 읽고 싶다.구체적으로는 파일을 루프하여 각 행을 루프 내의 변수에 저장하고 해당 라인에서 처리를 수행합니다.

나는 Bash에 상당하는 것을 안다.

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

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

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

PowerShell의 루프에 대한 설명서는 풍부하며, , , , , , , 등의 도움말 항목을 확인하는 것이 좋습니다.

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

이 문제에 대한 또 다른 관용적인 PowerShell 솔루션은 텍스트 파일의 을 cmdlet에 연결하는 것입니다.

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

루프 내에서 regex를 대조하는 대신, 관심 있는 라인만 필터링할 수 있습니다.

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(자세한 것은, 이하의 코멘트를 참조해 주세요).

대용량 파일 한 줄씩 읽기

Original Comment (1/2021) 4GB 로그 파일을 50초 만에 읽을 수 있었습니다.PowerShell을 사용하여 동적으로 C# 어셈블리로 로드하면 속도를 높일 수 있습니다.

[System.IO.StreamReader]$sr = [System.IO.File]::Open($file, [System.IO.FileMode]::Open)
while (-not $sr.EndOfStream){
    $line = $sr.ReadLine()
}
$sr.Close() 

부록 (2022년 3월) PowerShell에 내장된 C#을 사용하여 대용량 파일을 처리하는 것이 훨씬 빠르고 "가져오기"가 적습니다.

$code = @"
using System;
using System.IO;

namespace ProcessLargeFile
{
    public class Program
    {
        static void ProcessLine(string line)
        {
            return;
        }

        public static void ProcessLogFile(string path) {
            var start_time = DateTime.Now;
            StreamReader sr = new StreamReader(File.Open(path, FileMode.Open));
            try {
                while (!sr.EndOfStream){
                    string line = sr.ReadLine();
                    ProcessLine(line);
                }
            } finally {
                sr.Close();
            }
            var end_time = DateTime.Now;
            var run_time = end_time - start_time;
            string msg = "Completed in " + run_time.Minutes + ":" + run_time.Seconds + "." + run_time.Milliseconds;
            Console.WriteLine(msg);
        }

        static void Main(string[] args)
        {
            ProcessLogFile("c:\\users\\tasaif\\fake.log");
            Console.ReadLine();
        }
    }
}
"@
 
Add-Type -TypeDefinition $code -Language CSharp

PS C:\Users\tasaif> [ProcessLargeFile.Program]::ProcessLogFile("c:\\users\\tasaif\\fake.log")
Completed in 0:17.109

전능하신 분은 여기서 잘 일하십니다.

'one
two
three' > file

$regex = '^t'

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

출력:

line is two
line is three

Set-Location 'C:\files'
$files = Get-ChildItem -Name -Include *.txt
foreach($file in $files){
        Write-Host("Start Reading file: " + $file)
        foreach($line in Get-Content $file){
            Write-Host($line)
        }
        Write-Host("End Reading file: " + $file)                
}

언급URL : https://stackoverflow.com/questions/33511772/read-file-line-by-line-in-powershell

반응형