Eu acho que não há como não ler todo o arquivo na memória, pelo menos eu não conheço nenhum.
$csv = gci "C:\location" -filter *.csv | % {
(Get-Content $_.FullName | select -skip 3) | Set-Content $_.FullName
Add-Content -path $_.FullName -value ""
}
Esta seria uma solução do PowerShell que requer o carregamento de todo o arquivo na memória.
- pesquise todos os csv de um local com
gci
, - execute o loop sobre os arquivos csv encontrados com
foreach
alias%
, - obtenha todo o conteúdo (pode levar algum tempo) com
get-content
- selecione tudo, mas pule as 3 primeiras linhas
select -skip
- e defina esse conteúdo para o arquivo com
set-content
. - a última linha adicionará uma nova linha ao arquivo
add-content
Editar: Você pode tentar agilizar tudo isso adicionando o -ReadCount
Parameter à sua chamada get-content
.
-ReadCount (int)
Specifies how many lines of content are sent through the pipeline at a time. The default value is 1. A value of 0 (zero) sends all of the content at one time.
This parameter does not change the content displayed, but it does affect the time it takes to display the content. As the value of ReadCount increases, the time it takes to return the first line increases, but the total time for the operation decreases. This can make a perceptible difference in very large items.
Edit2: testei get-content
com readcount
. infelizmente eu não consegui encontrar um arquivo de texto maior que 89mb. mas a diferença já é significativa:
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
então get-content $_.FullName -readcount 0
é o caminho a percorrer