读取文件,提取字符,附加到所有行的开头,删除页眉和页脚,连接所有文件

读取文件,提取字符,附加到所有行的开头,删除页眉和页脚,连接所有文件

我有一大堆 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
循环打印前一行并读取下一行,这样会删除最后一行。

相关内容