这个问题与Remove Top Line of Text File with Powershell之间的区别在于我的文件很大(超过300M)。
我现在使用的技术基于one of the answers来解决这个问题,但对于大型文件来说似乎效率低下。是否有更快(更不漂亮)的方法呢?
答案 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)}
这还有一个额外的好处,就是能够读取和写入同一个文件。