讀取文件、提取字元、附加到所有行的開頭、剝離頁首和頁尾、連接所有文件

讀取文件、提取字元、附加到所有行的開頭、剝離頁首和頁尾、連接所有文件

我有一大組 ASCII 文字文件,需要使用文件中的內容進行修改,然後將它們全部連接到一個摘要文件中。到目前為止,我使用循序漸進的方法取得了一定的成功。但是,我想一下子做到這一點,但我一直無法弄清楚。我已經在 PowerShell 中編寫了一個腳本,它將為一個文件執行我想要的操作,但我似乎不知道如何為資料夾中的所有文件修改它。我一直在努力解決循環和最終文件連接部分。

這是我的基本文件結構:

文件1.txt

Line1 - abc123 - header(我想從這裡刪除字元2,3和4並添加到資料行)
Line2 - data1
Line3 - data2
LineN - abc123 - footer(標題的重複項)

文件2.txt

線路 1 - efg456
線路 2 - 數據 3
線路 3 - 數據 4
線路 N - efg456

文件N.txt

線路 1 - hij789
線路 2 - 數據 5
線路 3 - 數據 6
線路 N - hij789

我希望最終的輸出檔案具有以下結構,刪除頁首和頁腳,並從文件開頭的新列中的頁眉中提取內容(這些是固定寬度檔案):

最終結果.txt

Line1 - bc1data1
Line2 - bc1data2
Line3 - fg4data3
Line4 - fg4data4
Line5 - ij7data5
Line6 - 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 迴圈會列印上一行並以此方式讀取下一行,刪除最後一行。

相關內容