使用powershell删除巨大(300M)文本文件的顶行

时间:2012-03-12 13:58:59

标签: powershell file-io

这个问题与Remove Top Line of Text File with Powershell之间的区别在于我的文件很大(超过300M)。

我现在使用的技术基于one of the answers来解决这个问题,但对于大型文件来说似乎效率低下。是否有更快(更不漂亮)的方法呢?

2 个答案:

答案 0 :(得分:5)

尝试使用streamreader和streamwriter。这应该很快。

$reader = [IO.File]::OpenText("C:\Users\Andy\Documents\input.txt")
$writer = New-Object System.IO.StreamWriter("C:\Users\Andy\Documents\output.txt")

$reader.ReadLine() > $null # Skip first line.
while ($reader.Peek() -ge 0) {
    $writer.writeline($reader.ReadLine())
}

$reader.Close()
$writer.Close()

我通过创建一个300MB的文本文件进行测试并在其上使用它。 output.txt是在3.5秒内创建的: - )。

更新我稍微优化了它,因此它不会在循环的每次迭代中都不计算表达式。现在它在2.9秒内完成:-)

如果你不介意记忆臃肿,你也可以这样做。这仍然更快,但需要更多内存,但小于Get-Content

$reader = [IO.File]::OpenText("C:\Users\Andy\Documents\input.txt")
$writer = New-Object System.IO.StreamWriter("C:\Users\Andy\Documents\output.txt")

$reader.ReadLine() > $null # Skip first line.
$writer.write($reader.ReadToEnd())

$reader.Close()
$writer.Close()

答案 1 :(得分:0)

正如Andy的回答一样,StreamWriter是最佳选择。 但是,我发现Measure-Command使用gc $file -ReadCount 0的结果比StreamReader更好。

$contents=gc C:\My\File.txt -ReadCount 0
$w=New-Object System.IO.StreamWriter("C:\My\File.txt")
foreach($line in $contents){if(!$f++){continue}$w.WriteLine($line)}

这还有一个额外的好处,就是能够读取和写入同一个文件。