Lê arquivos, extrai caracteres, acrescenta início a todas as linhas, tira cabeçalho e rodapé, concatena todos os arquivos

1

Eu tenho um grande conjunto de arquivos de texto ASCII que eu preciso modificar com o conteúdo encontrado no arquivo e concatenar todos eles em um arquivo de resumo. Eu tive sucesso moderado usando uma abordagem passo a passo até agora. Mas eu gostaria de fazer isso de uma só vez e não consegui descobrir. Eu escrevi um script no PowerShell que fará o que eu quero para um arquivo, mas não consigo descobrir como modificá-lo para todos os arquivos na pasta. Eu tenho lutado com o looping e as seções finais de concatenação de arquivos.

Aqui está minha estrutura básica de arquivos:

Arquivo1.txt

Line1 - abc123 - cabeçalho (quero remover os caracteres 2,3, & 4 daqui e adicionar às linhas de dados)
Line2 - data1
Line3 - data2
LineN - abc123 - rodapé (uma duplicata do cabeçalho)

Arquivo2.txt

Line1 - efg456
Line2 - data3
Line3 - data4
LineN - efg456

FileN.txt

Line1 - hij789
Linha2 - data5
Linha3 - data6
LinhaN - hij789

Eu gostaria que o arquivo de saída final tivesse a seguinte estrutura com o cabeçalho e rodapés removidos e o conteúdo extraído do cabeçalho em uma nova coluna no início do arquivo (estes são arquivos de largura fixa):

Final.txt

Line1 - bc1data1
Line2 - bc1data2
Line3 - fg4data3
Line4 - fg4data4
Line5 - ij7data5
Line6 - ij7data6

Eu consegui resolver isso para um arquivo e coloquei o código abaixo:

cd "C:\Data\Files\"
$S1 = Get-Content File1.txt -First 1
$S2 = $S1.Substring(2,3)
Get-Content File1.txt | ForEach-Object {Add-Content a.txt "$S2$_"}
Get-Content a.txt | Select -Skip 1 | Select -SkipLast 1 | Set-Content out.txt
# extract header line
# limit to characters of interest
# append to the beginning of each line in file
# append all files together w/o first & last line

Idealmente, eu poderia fazer isso sem o arquivo lixo a.txt também, mas eu só consegui fazê-lo funcionar escrevendo em um arquivo separado até agora. Qualquer sugestão / sugestão será apreciada, já que sou relativamente novo no PowerShell (poucas horas de prática).

    
por Karl 25.08.2017 / 00:39

1 resposta

0
## Q:\Test17\SU_1244148.ps1

Set-Location "C:\Data\Files\"
$Files = Get-ChildItem File*.txt
$Final = ForEach ($File in $Files){
    $Content = Get-Content $File
    $Prefix = $Content[0].Substring(1,3)
    For ($i = 1;$i -lt $Content.Length-1;$i++){
         "{0}{1}" -f $Prefix,$Content[$i]
    } 
} 
$Final | Set-Content Final.txt
> gc .\Final.txt
bc1data1
bc1data2
fg4data3
fg4data4
ij7data5
ij7data6

Versão 2 lida com arquivos grandes

## Q:\Test17\SU_1244148_2.ps1
#Set-Location "C:\Data\Files\"

$Files = (Get-ChildItem File*.txt|Sort)
$Final = '.\Final.txt'

## As we append to $Final initially clear
If (Test-Path $Final){Remove-Item $Final}

ForEach ($File in $Files){
    $Reader = [IO.File]::OpenText($File)
    $Header = $Reader.ReadLine()
    $Prefix = $Header.SubString(1,3)
    $Line = $Reader.ReadLine()
    while ($Reader.Peek() -ge 0) {
        $Prefix+$Line| Out-File $Final -Append
        $Line = $Reader.ReadLine()
    }
    $Reader.Dispose()
} 

Código otimizado para não ter que testar o cabeçalho à direita.
O loop while imprime a linha anterior e lê a próxima dessa maneira, soltando a última linha.

    
por 25.08.2017 / 03:29

Tags