Powershell 版本的 cut -d 在处理大文件时非常慢,我是否缺少快速的方法?

问题描述 投票:0回答:1

我有一个非常大(>100k 行)的文件,我想将其拆分

:

然后我想丢弃第一个项目,并保留其余所有项目。例如,
foo:bar:baz
变为
bar:baz

如果我这样做
cut -d ':' -f2- myfile.txt > newfile.txt
它会在几毫秒内完成。
我在 Powershell 中尝试了几种方法,但还没有看到一种完成。几分钟后,我中止了,因为这个脚本不能等待那么久。当然有更好/更快的方法来做到这一点,但我似乎找不到它。

迄今为止我发现的最有前途的方法如下所示:

$reader = [System.IO.File]::OpenText("myfile.txt")
try {
    for() {
        $line = $reader.ReadLine()
        if ($line -eq $null) { break }
        $split = $line.Split(":")
        $join = $split[1..($split.Length-1)] -join ":"
        Add-Content -Path "newfile.txt" -Value "$join"
    }
}
finally {
    $reader.Close()
}

请帮忙/建议。

powershell
1个回答
0
投票

在此答案的两个示例中,您可以使用正则表达式而不是拆分,这样会更有效。有关正则表达式的详细信息,您可以检查:https://regex101.com/r/iGfHWp/1

  • 如果您可以一次读取所有文件内容,那么您可以这样做:
(Get-Content myfile.txt -Raw) -replace '(?m)^.+?:' |
    Set-Content newfile.txt
  • 如果您无法一次读取所有文件内容并且需要尽可能低的内存使用量但仍保持高效,那么我建议
    File.ReadLines
    +
    StreamWriter
    :
try {
    # use absolute path always in this case, i.e.:
    # `newfile.txt` should be `X:\path\to\newfile.txt`
    $writer = [System.IO.StreamWriter] 'newfile.txt'
    $re = [regex]::new(
        '^.+?:', [System.Text.RegularExpressions.RegexOptions]::Compiled)

    foreach ($line in [System.IO.File]::ReadLines('myfile.txt')) {
        $writer.WriteLine($re.Replace($line))
    }
}
finally {
    if ($writer) {
        $writer.Dispose()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.