Удалите верхнюю строку огромного (300M) текстового файла с PowerShell - PullRequest
2 голосов
/ 12 марта 2012

Разница между этим вопросом и Удалите верхнюю строку текстового файла с помощью Powershell в том, что мой файл огромен (более 300M).

Техника, которую я сейчас использую, основана на один из ответов на этот вопрос, однако он кажется неэффективным для больших файлов.Есть ли более быстрый (и менее привлекательный) способ сделать это?

Ответы [ 2 ]

5 голосов
/ 12 марта 2012

Попробуйте использовать потоковый ридер и потоковый писатель. Это должно выполнить быстро.

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

Я проверил, создав текстовый файл размером 300 МБ, и использовал его на нем. 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()
0 голосов
/ 13 марта 2012

Как и в ответе Энди, 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)}

Это также дает дополнительное преимущество, заключающееся в возможности чтения и записи в один и тот же файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...