从文件中按行号分段读取

时间:2019-07-09 21:33:37

标签: powershell

我们有报告,我们需要在每个记录中重新格式化某些文本行(当前是手动完成),但是它们存在于一个大文本文件中。每条记录的长度可以在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
    }
}

据我所知。我什么也没做,将使下一节开始从行号开始阅读,然后从那里继续浏览文件。任何帮助将不胜感激。

1 个答案:

答案 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