Powershell: выборка данных из текстового файла - PullRequest
0 голосов
/ 13 февраля 2020

INPUT FILE

Привет всем,

Я пытаюсь получить список утверждающих для каждой группы. Ниже приведен пример кода, который я пытаюсь сделать.

Ожидаемый результат

EXPECTED OUTPUT

Любые подсказки, как это сделать?

Спасибо

$file = 'textfile.txt'
$groups

foreach($line in Get-Content $file){

$Lines = Get-Content $file
$Output = 

For( $i = 0; $i -lt $Lines.Length; ++$i)
{
    If($Line.StartsWith("# APPROVER:"))
    {
        $Lines[$i]
        # Need to ignore lines in between
        :LookForGroup Do
        {
            ++$i
            If( $Lines[$i].StartsWith($groups))
            {
                $Lines[$i]
                ""
                Break LookForGroup
            }
        } While($true)
    }
}
}
$Output

1 Ответ

1 голос
/ 13 февраля 2020

Похоже, вы разбиваете и заменяете его, чтобы получить содержимое файла в отдельных строках. Однако Get-Content делает это по умолчанию. Более того, в вашем коде $ line & $ content будут иметь одинаковые значения.

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

Я вручную напечатал файл, как довольно хорошее совпадение с тем, что вы продемонстрировали в пересмотренном вопросе. Придумали ниже. Опять же, это не в моей голове, но, похоже, работает так, как вы продиктовали выше.

Примечание: я добавил массив $ Groups только для того, чтобы имитировать то, что вы сказали в своем последнем комментарии.

$File = 'C:\Temp\InputTest.txt'
$Groups = @( 'Group1','Group2','Group3','Group4','Group5' )

$Lines = Get-Content $File
$Output = 
For( $i = 0; $i -lt $Lines.Length; ++$i )
{
    If( $Lines[$i] -match '^# approver' )
    {
        $Approver = $Lines[$i].split(':').Trim()[1]
        # Need to ignore lines in between
        :LookForGroup Do
        {
            ++$i
            ForEach ( $Group in $Groups )
            {
                If( $Lines[$i] -match "^$Group" )
                {
                    $Approver + ' ' + $Lines[$i]
                    ++$i
                }
                ElseIf( $Lines[$i]  -match "(^$|\r\n|^######)")
                {# Looking for a signal to move on...
                    Remove-Variable Approver #Maybe don't need this???
                    Break LookForGroup
                }
            }
        } While($true)
    }
}
#This will display the output, you can do something else with it...
$Output

То, что я делаю, использует $ i вроде курсора. Как только линия утверждающего обнаружена, я go проходит через каждую группу, чтобы увидеть, соответствует ли строка названию группы. Если да, я выводю утверждающего и имя группы, как вы указали. Затем я увеличиваю $ i, перемещая одну строку вперед в файле. Если строка не соответствует группе, я проверяю некоторые характеристики, чтобы убедиться, что мы достигли конца раздела (как определено в вашем примере). Если да, я сломаю Do l oop, что приведет к продолжению For l oop, обратите внимание: $ i останется таким, как мы его установим ...

Я признаю, что это немного Kludge, дайте мне знать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...