我们有报告,我们需要在每个记录中重新格式化某些文本行(当前是手动完成),但是它们存在于一个大文本文件中。每条记录的长度可以在64-70行之间,但是在打印时每页将是一条记录,因此我们需要知道每条记录的长度,以便可以正确格式化它们并将其写入新文件。
由于每条记录均以关键字开头和结尾,因此我们可以计算它们之间的行数,以了解要处理的行数,但是如何从该位置开始读取?
例如,第一条记录从第72行开始,长68行。因此,下一条记录将从145(68行,加上页脚关键字和空行)开始。我们如何从第145行开始,然后读取'x'行数?
我想到了“执行/同时执行”或“执行/直到执行”,但这似乎行不通。我使用Do / Until,它要么返回空行,要么一遍又一遍地重复一行。此外,从特定行开始读取文件也无济于事。
$path = "\somefolder\somefile.txt"
$array = @()
$linecount = 0
#Read the file; this is the Header section
#Number of lines may vary
foreach($line in Get-Content $path)
{
$linecount++
If($line -match "End of Header")
{
break
}
else
{
$array += $line
}
}
据我所知。我什么也没做,将使下一节开始从行号开始阅读,然后从那里继续浏览文件。任何帮助将不胜感激。
答案 0 :(得分:0)
尝试一下:
Add-Type -AssemblyName System.Collections
Add-Type -AssemblyName System.Text.RegularExpressions
[System.Collections.Generic.List[string]]$content = @()
$inputFile = 'D:\content.txt'
$outputFile = 'D:\content1.txt'
$addLines = $false
$startLine = 30 # if not needed, set to 0
$lineCounter = 0
foreach($line in [System.IO.File]::ReadLines($inputFile)) {
$lineCounter++
if( $line -like '*Begin of Header*' -or $lineCounter -eq $startLine) {
$addLines = $true
}
elseif( $line -like '*End of Header*') {
break
}
elseif( $addLines ) {
[void]$content.Add( $line )
}
}
[System.IO.File]::WriteAllLines( $outputFile, $content ) | Out-Null