Leer archivos, extraer caracteres, agregar al principio de todas las líneas, eliminar encabezados y pies de página, concatenar todos los archivos

Leer archivos, extraer caracteres, agregar al principio de todas las líneas, eliminar encabezados y pies de página, concatenar todos los archivos

Tengo un gran conjunto de archivos de texto ASCII que necesito modificar con el contenido que se encuentra en el archivo y luego concatenarlos todos en un archivo de resumen. Hasta ahora he tenido un éxito moderado utilizando un enfoque paso a paso. Pero me gustaría hacer esto de una sola vez y no he podido resolverlo. Escribí un script en PowerShell que hará lo que quiero para un archivo, pero parece que no puedo entender cómo modificarlo para todos los archivos de la carpeta. He estado luchando con las secciones de bucle y concatenación de archivos finales.

Aquí está mi estructura de archivos básica:

Archivo1.txt

Línea1 - abc123 - encabezado (quiero eliminar los caracteres 2,3 y 4 de aquí y agregarlos a las líneas de datos)
Línea2 - datos1
Línea3 - datos2
LíneaN - abc123 - pie de página (un duplicado del encabezado)

Archivo2.txt

Línea1 - efg456
Línea2 - datos3
Línea3 - datos4
LíneaN - efg456

ArchivoN.txt

Línea1 - hij789
Línea2 - datos5
Línea3 - datos6
LíneaN - hij789

Me gustaría que el archivo de salida final tuviera la siguiente estructura con el encabezado y los pies de página eliminados y el contenido extraído del encabezado en una nueva columna al comienzo del archivo (estos son archivos de ancho fijo):

final.txt

Línea1 - bc1data1
Línea2 - bc1data2
Línea3 - fg4data3
Línea4 - fg4data4
Línea5 - ij7data5
Línea6 - ij7data6

Pude resolver esto para un archivo y puse el código a continuación:

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, también podría hacer esto sin el archivo basura a.txt, pero hasta ahora solo he podido hacerlo funcionar escribiendo en un archivo separado. Cualquier sugerencia/consejo sería apreciado ya que soy bastante nuevo en PowerShell (pocas horas de práctica).

Respuesta1

## Q:\Test\2017\08\25\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

Versión 2maneja archivos grandes

## Q:\Test\2017\08\25\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 optimizado para no tener que probar el encabezado final.
El bucle while imprime la línea anterior y lee la siguiente de esta manera eliminando la última línea.

información relacionada