获取包含巨大文本文件中的字符串的所有行 - 尽可能快?

SA3*_*345 15 powershell

在Powershell中,如何在一个巨大的文本文件(大约200000行/ 30 MBytes)中读取并尽可能快地获取包含特定字符串的最后一行(或所有行)?我正在使用 :

get-content myfile.txt | select-string -pattern "my_string" -encoding ASCII | select -last 1
Run Code Online (Sandbox Code Playgroud)

但它非常长(约16-18秒).我做了没有最后一根管道的测试" select -last 1",但它是同一时间.

没有更快的方法来获取巨大文件中特定字符串的最后一次出现(或所有出现)?

也许这是所需的时间......或者它有可能从最后更快地读取文件,因为我想要最后一次出现?谢谢

mjo*_*nor 42

试试这个:

get-content myfile.txt -ReadCount 1000 |
 foreach { $_ -match "my_string" }
Run Code Online (Sandbox Code Playgroud)

这将一次读取1000个记录的块中的文件,并找到每个块中的匹配项.这样可以提供更好的性能,因为您不会在内存管理上浪费大量的CPU时间,因为管道中一次只有1000行.

  • 即使使用 `-ReadCount=1000`,`get-content` 仍然会将整个内容读入内存。我试图解析一个 40GB 的文件时内存不足。还有其他想法吗? (4认同)

小智 6

$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
Run Code Online (Sandbox Code Playgroud)


Rob*_*e P 5

你有没有尝试过:

gc myfile.txt | % { if($_ -match "my_string") {write-host $_}}
Run Code Online (Sandbox Code Playgroud)

或者,您可以创建一个类似于“ grep”的函数:

function grep($f,$s) {
    gc $f | % {if($_ -match $s){write-host $_}}
    }
Run Code Online (Sandbox Code Playgroud)

然后,您可以发出: grep $myfile.txt $my_string


小智 1

你尝试过使用[System.IO.File]::ReadAllLines();吗?此方法比 PowerShell 式的方法更“原始”,因为我们直接插入 Microsoft .NET Framework 类型。

$Lines = [System.IO.File]::ReadAllLines();
[Regex]::Matches($Lines, 'my_string_pattern');
Run Code Online (Sandbox Code Playgroud)

  • 该用户明确表示他正在使用大文件,为什么您会发布“如果使用大文件可能会崩溃”的解决方案? (4认同)