Чтение из файла в разделах по номерам строк - PullRequest
1 голос
/ 10 июля 2019

У нас есть отчеты, в которых нам нужно переформатировать определенные строки текста в каждой записи (в настоящее время это делается вручную), однако они приходят в один большой текстовый файл. Каждая запись может иметь длину от 64 до 70 строк, но при печати она будет составлять одну запись на страницу, поэтому нам нужно знать, какова длина каждой записи, чтобы их можно было правильно отформатировать и записать в новый файл.

Поскольку каждая запись начинается и заканчивается ключевыми словами, мы можем подсчитать количество строк между ними, чтобы узнать, сколько строк мы имеем дело, но как нам начать чтение с этой позиции?

Например, первая запись начинается со строки 72 и имеет длину 68 строк. Таким образом, следующая запись начнется с 145 (68 строк, плюс ключевые слова нижнего колонтитула и пустые строки). Как мы начнем со строки 145, а затем прочитаем число строк «х»?

Я думал о «До / Пока» или «До / До», но, похоже, это не работает. Я использую До / До, и он либо возвращает пустые строки, либо повторяет одну строку снова и снова. Кроме того, это не помогает начать чтение файла с определенной строки.

$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 голосов
/ 10 июля 2019

Попробуйте это:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...