Arquivos de texto grandes com PowerShell
Dividir arquivos grandes para processando
Lidar com arquivos de texto extensos pode ser um pouco difícil ou demorado, mas podemos facilitar com algumas funções em PowerShell
Contar linhas
Substituir o <caminho do arquivo>
$nlines = 0;
$file = '<caminho do arquivo>'
gc $file -read 1000 | % { $nlines += $_.Length };
[string]::Format("{0} has {1} lines", $file, $nlines)
Separar arquivos por quantidades de linhas
Separar um arquivo grande de serem processados individualmente facilita o processo e controle do progresso
Substituindo o <caminho do arquivo>
e a <quantidade de linhas>
o código gera out_<número>.txt
até o fim do texto
$i=0; Get-Content '<caminho do arquivo>' -ReadCount <quantidade de linhas> | %{$i++; $_ | Out-File out_$i.txt}
Na nossa língua temos vários caracteres diferentes e acentos, temos de usar um encode para evitar problemas, no exemplo estou usando o UTF8, mas temos as opções de ASCII, BigEndianUnicode, OEM, String, Unicode, UTF7, UTF8, UTF8BOM, UF8NoBOM, UTF32 e Unknown
$i=0; Get-Content '<caminho do arquivo>' -Encoding "UTF8" -ReadCount <quantidade de linhas> | %{$i++; $_ | Out-File -Encoding "UTF8" out_$i.csv}
Adicionar cabeçalho para os arquivos
Trabalhando banco de dados em arquivos de texto devemos adicionar o cabeçalho para facilitar a manipulação dos arquivos
Podemos adicionar um cabeçalho fixo, com o código abaixo substituindo o <caminho do arquivo>
e a <texto do cabeçalho>
$textfile = '<caminho do arquivo>'
$header = '<texto do cabeçalho>'
$($header; Get-Content $textfile) | Set-Content $textfile
Podemos adicionar ou através de um arquivo contendo o cabeçalho, com o código abaixo substituindo o <caminho do arquivo>
e a <caminho do arquivo cabeçalho>
$textfile = '<caminho do arquivo>'
$headerfile = '<caminho do arquivo cabeçalho>'
$(Get-Content $headerfile; Get-Content $textfile) | Set-Content $textfile
Dividir as linhas mantendo o cabeçalho
Adicionando os controles de $header = Get-Content $file -First 1
para capturar o cabeçalho na primeira linha e $(If ($i -ne 1) {$header} Else {$null})
para adicionar nos arquivos além do primeiro o cabeçalho arquivo
Com o código abaixo substituindo o <caminho do arquivo>
e a <quantidade de linhas>
$file = '<caminho do arquivo>'
$qtd_lines = <quantidade de linhas>
$header = Get-Content $file -First 1
$i=0; Get-Content $file -Encoding "UTF8" -ReadCount $qtd_lines | %{$i++; $($(If ($i -ne 1) {$header} Else {$null}); $_) | Out-File -Encoding "UTF8" out_$i.csv}