在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行.
小智 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)
你有没有尝试过:
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)
| 归档时间: |
|
| 查看次数: |
79286 次 |
| 最近记录: |