Чтение файлов, извлечение символов, добавление в начало всех строк, удаление заголовков и нижних колонтитулов, объединение всех файлов

Чтение файлов, извлечение символов, добавление в начало всех строк, удаление заголовков и нижних колонтитулов, объединение всех файлов

У меня есть большой набор текстовых файлов ASCII, которые мне нужно изменить с помощью содержимого, найденного в файле, а затем объединить их все в один сводный файл. До сих пор я добился умеренного успеха, используя пошаговый подход. Но я хотел бы сделать это одним махом и не смог разобраться. Я написал скрипт в PowerShell, который сделает то, что я хочу, для одного файла, но я не могу понять, как изменить его для всех файлов в папке. Я боролся с циклами и разделами окончательной конкатенации файлов.

Вот моя базовая структура файла:

Файл1.txt

Строка1 - abc123 - заголовок (я хочу удалить символы 2, 3 и 4 отсюда и добавить в строки данных)
Строка2 - данные1
Строка3 - данные2
СтрокаN - abc123 - нижний колонтитул (дубликат заголовка)

Файл2.txt

Строка1 - efg456
Строка2 - данные3
Строка3 - данные4
СтрокаN - efg456

ФайлN.txt

Строка1 - hij789
Строка2 - данные5
Строка3 - данные6
СтрокаN - hij789

Мне бы хотелось, чтобы конечный выходной файл имел следующую структуру с удаленными верхним и нижним колонтитулами и извлеченным из заголовка содержимым в новом столбце в начале файла (это файлы фиксированной ширины):

Финальный.txt

Строка1 - bc1data1
Строка2 - bc1data2
Строка3 - fg4data3
Строка4 - fg4data4
Строка5 - ij7data5
Строка6 - ij7data6

Мне удалось решить эту проблему для одного файла, и я привожу код ниже:

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

В идеале я мог бы сделать это и без мусорного файла a.txt, но пока мне удалось заставить его работать только путем записи в отдельный файл. Буду признателен за любые предложения/советы, так как я довольно новичок в PowerShell (несколько часов практики).

решение1

## 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

Версия 2обрабатывает большие файлы

## 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()
} 

Оптимизированный код, чтобы не проверять наличие завершающего заголовка.
Цикл while печатает предыдущую строку и считывает следующую таким образом, отбрасывая самую последнюю строку.

Связанный контент