programing

큰 텍스트 파일에 문자열이 포함된 모든 줄을 최대한 빨리 가져오시겠습니까?

lovejava 2023. 8. 12. 09:39

큰 텍스트 파일에 문자열이 포함된 모든 줄을 최대한 빨리 가져오시겠습니까?

Powershell에서 대용량 텍스트 파일(약 200,000줄/30MB)에 특정 문자열이 포함된 마지막 줄(또는 모든 줄)을 가능한 빨리 읽고 얻는 방법은 무엇입니까?사용 중:

get-content myfile.txt | select-string -pattern "my_string" -encoding ASCII | select -last 1

하지만 그것은 매우 깁니다 (약 16-18초).저는 마지막 파이프 없이 테스트를 했습니다.select -last 1하지만 같은 시간입니다.

대용량 파일에서 특정 문자열의 마지막 항목(또는 모든 항목)을 더 빠르게 가져올 수 있는 방법이 있습니까?

아마도 필요한 시간일 것입니다...아니면 내가 마지막으로 원하는 대로 파일을 끝에서 더 빨리 읽을 수 있는 가능성이 있습니까?감사해요.

사용해 보십시오.

get-content myfile.txt -ReadCount 1000 |
 foreach { $_ -match "my_string" }

그러면 한 번에 1000개의 레코드 청크로 파일을 읽고 각 청크에서 일치하는 항목을 찾습니다.파이프라인에는 한 번에 1000개의 라인만 있으므로 메모리 관리에 많은 CPU 시간을 낭비하지 않으므로 성능이 향상됩니다.

시도해 보셨습니까?

gc myfile.txt | % { if($_ -match "my_string") {write-host $_}}

또는 "grep"와 같은 함수를 만들 수 있습니다.

function grep($f,$s) {
    gc $f | % {if($_ -match $s){write-host $_}}
    }

그러면 다음과 같이 발행할 수 있습니다.grep $myfile.txt $my_string

$reader = New-Object System.IO.StreamReader("myfile.txt")

$lines = @()

if ($reader -ne $null) {
    while (!$reader.EndOfStream) {
        $line = $reader.ReadLine()
        if ($line.Contains("my_string")) {
            $lines += $line
        }
    }
}

$lines | Select-Object -Last 1

사용해 보셨습니까?[System.IO.File]::ReadAllLines();이 방법은 Microsoft에 직접 연결하기 때문에 PowerShell-esque 방법보다 더 "원시"합니다.NET Framework 유형.

$Lines = [System.IO.File]::ReadAllLines();
[Regex]::Matches($Lines, 'my_string_pattern');

실패한 줄을 추출하고 이 줄을 새 파일에 쓰고 싶어서 전체 명령을 추가합니다.

get-content log.txt -ReadCount 1000 |
>>  foreach { $_ -match "failed" } | Out-File C:\failes.txt 

언급URL : https://stackoverflow.com/questions/21310538/get-all-lines-containing-a-string-in-a-huge-text-file-as-fast-as-possible