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

使用powershell删除大型(300M)文本文件的顶行,powershell,file-io,Powershell,File Io,这个问题和其他问题的区别在于我的文件很大(超过3亿) 我现在使用的技术就是基于这个问题,但是对于大型文件来说,它似乎效率低下。有没有更快(也不那么漂亮)的方法呢?尝试使用streamreader和streamwriter。这应该很快就能实现 $reader = [IO.File]::OpenText("C:\Users\Andy\Documents\input.txt") $writer = New-Object System.IO.StreamWriter("C:\Users\Andy\Doc

这个问题和其他问题的区别在于我的文件很大(超过3亿)


我现在使用的技术就是基于这个问题,但是对于大型文件来说,它似乎效率低下。有没有更快(也不那么漂亮)的方法呢?

尝试使用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秒内完成:-)

如果你不介意内存膨胀,你也可以这样做。这速度更快,但占用的内存更多,但比获取内容要少

$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()

正如Andy的回答一样,StreamWriter是一个不错的选择。 然而,我看到使用
gc$file-ReadCount 0的
Measure命令
比使用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)}

这还有一个额外的好处,即可以读取和写入同一个文件。

ReadCount
0将所有内容加载到内存中,这会大大增加PowerShell的容量。对我来说,它达到了720MBs。根据可用内存的多少,它可能会导致内存不足异常。是的,毫无疑问,它会提高内存使用率。在PowerShell之前使用过的大型文件中,文件大小将增长3倍以上(这是一个我想自己知道答案的问题),但对于这种大小的文件,我假设它是一个服务器环境,这意味着它拥有大量资源和首选性能。