Я думаю, что нет способа не прочитать весь файл в памяти, по крайней мере, я не знаю ни одного.
$csv = gci "C:\location" -filter *.csv | % {
(Get-Content $_.FullName | select -skip 3) | Set-Content $_.FullName
Add-Content -path $_.FullName -value ""
}
Это будет решение PowerShell, которое требует загрузки всего файла в память.
- искать каждый CSV из местоположения с помощью
gci
,
- перебрать найденные CSV-файлы с псевдонимом
foreach
%
,
- получить весь их контент (может занять некоторое время) с помощью
get-content
,
- выбрать все, но пропустить первые 3 строки
select -skip
- и установите этот контент в файл с
set-content
.
- последняя строка добавит новую строку в файл
add-content
Изменить: Вы можете попытаться сделать все это быстрее, добавив параметр -ReadCount
к вашему вызову get-content
.
-ReadCount (int)
Определяет, сколько строк контента отправляется через конвейер одновременно. Значением по умолчанию является 1. Значение 0 (ноль) отправляет весь контент за один раз.
Этот параметр не изменяет отображаемое содержимое, но влияет на время, необходимое для отображения содержимого. По мере увеличения значения ReadCount время, необходимое для возврата первой строки, увеличивается, но общее время операции уменьшается. Это может существенно повлиять на очень большие предметы.
Edit2: я тестировал get-content
с помощью readcount
. к сожалению, я не смог найти текстовый файл размером более 89 МБ. но разница уже значительна
PS C:\Windows\System32> Measure-Command { gc "C:\Pub.log" -readcount 0 }
Days : 0
Hours : 0
Minutes : 0
Seconds : 1
Milliseconds : 22
Ticks : 10224578
TotalDays : 1.18340023148148E-05
TotalHours : 0.000284016055555556
TotalMinutes : 0.0170409633333333
TotalSeconds : 1.0224578
TotalMilliseconds : 1022.4578
PS C:\Windows\System32> Measure-Command { gc "C:\Pub.log" -readcount 1 }
Days : 0
Hours : 0
Minutes : 0
Seconds : 10
Milliseconds : 594
Ticks : 105949457
TotalDays : 0.000122626686342593
TotalHours : 0.00294304047222222
TotalMinutes : 0.176582428333333
TotalSeconds : 10.5949457
TotalMilliseconds : 10594.9457
так что get-content $_.FullName -readcount 0
- путь