ファイルを読み取り、文字を抽出し、すべての行の先頭に追加し、ヘッダーとフッターを削除し、すべてのファイルを連結します。

ファイルを読み取り、文字を抽出し、すべての行の先頭に追加し、ヘッダーとフッターを削除し、すべてのファイルを連結します。

大量の ASCII テキスト ファイルがあり、ファイル内のコンテンツを変更して、すべてを 1 つの要約ファイルに連結する必要があります。これまで、段階的なアプローチを使用して、ある程度成功しています。しかし、これを一挙に実行したいのですが、まだ方法がわかりません。PowerShell でスクリプトを作成し、1 つのファイルに対して必要な操作を実行しましたが、フォルダー内のすべてのファイルに対して変更する方法がわかりません。ループと最後のファイル連結セクションで苦労しています。

基本的なファイル構造は次のとおりです。

ファイル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

私は 1 つのファイルでこの問題を解決し、以下のコードを配置しました。

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
ループは前の行を出力し、最後の行を削除して次の行を読み取ります。

関連情報