Чтение определенной строки в файле с неизвестным индексом с помощью PowerShell? - PullRequest
0 голосов
/ 29 марта 2019

У меня есть IN-файл, который выглядит следующим образом.

;**********  Information  **********
;Date=190303
;Class_1=US13091990#1Joyce#2Female
;Phone_Number=98233215.00
;School=St.Joseph\JuniorHighSchool
;ID=F1
;***********************************

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

$File = Get-Content .\file_input
$File = Select-String "Class_1"
$File

Ответы [ 5 ]

1 голос
/ 29 марта 2019

объект, возвращаемый при использовании Select-String, является объектом MatchInfo. это может вызвать проблемы при попытке использовать результат в виде строки. Вот один из способов справиться с этим ... и проанализировать вывод в $ vars.

вы можете предпочесть разобрать строку в PSCustomObject. Если у вас есть проблемы с этим и вам нужна помощь, пожалуйста, спросите. [ ухмылка ]

код ...

# fake reading in a text file
#    in real life, use Get-Content
$InStuff = @'
;**********  Information  **********
;Date=190303
;Class_1=US13091990#1Joyce#2Female
;Phone_Number=98233215.00
;School=St.Joseph\JuniorHighSchool
;ID=F1
;***********************************
'@ -split [environment]::NewLine

$ThingToFind = 'Class_1'

$FoundString = $InStuff |
    Select-String -SimpleMatch $ThingToFind

# Select-String returns a MatchInfo object,
#    so it needs to be converted to a regular string before using it as such
$ID_Number, $Name, $Gender = $FoundString.ToString().Split('=')[1].Split('#')
$Name = $Name.Trim('1')
$Gender = $Gender.Trim('2')


$FoundString.ToString()
$ID_Number
$Name
$Gender

вывод ...

;Class_1=US13091990#1Joyce#2Female
US13091990
Joyce
Female
1 голос
/ 29 марта 2019

Не нужно беспокоиться о том, где он появляется в файле. Используйте силу ConvertFrom-StringData здесь. Он преобразует список пар ключ-значение в хеш-таблицу.

  1. Читать в файле.
  2. Фильтруйте точки с запятой, удваивайте обратную косую черту (как это будет выглядеть позже как escape-последовательность) и игнорируйте границы записи.
  3. Сохранить как одну строку и передать ConvertFrom-StringData
  4. Преобразовать в объект PowerShell

$filteredContent = (Get-Content "c:\temp\file_input") -replace '^;' -replace '\\','\\' | Where-Object{-not $_.startswith('*')} 
$information = [pscustomobject]($filteredContent -join "`r`n" | ConvertFrom-StringData)
$information.class_1

Таким образом, используя вышесказанное, вот как будет выглядеть $information.

Class_1      : US13091990#1Joyce#2Female
School       : St.Joseph\JuniorHighSchool
Date         : 190303
Phone_Number : 98233215.00
ID           : F1

Это также облегчит работу с большим количеством этих записей и даст вам больше гибкости, если вам потребуется больше постобработки.

1 голос
/ 29 марта 2019

Вы можете сделать что-то вроде следующего, чтобы прочитать ваш INI-файл и выбрать строку, содержащую Class_ число :

$a = Get-Content ini.ini
$data = $a | Select-String -Pattern "Class_\d+"

Оттуда вы можете использовать $data для доступаразные части линии.Ниже приведены некоторые примеры:

$NumberAfterUnderscore = ($data.matches.value -split "_")[1]
$DataAfterEqualSign = ($data -split "=")[1]
$DataBetweenEqualandPound = (($data -split "=")[1] -split "#")[0]
$DataBetweenFirstandSecondPounds = (($data -split "=")[1] -split "#")[1]
$DataAfterLastPound = (($data -split "=")[1] -split "#")[2]

Вот выводы из кода выше:

$NumberAfterUnderscore
1

$DataAfterEqualSign
US13091990#1Joyce#2Female

$DataBetweenEqualandPound
US13091990

$DataBetweenFirstandSecondPounds
1Joyce

$DataAfterLastPound
2Female

$data.matches.value
Class_1
1 голос
/ 29 марта 2019

EDIT

Как и предполагалось, здесь снова приведен код с некоторыми комментариями. Я также отредактировал часть кода, чтобы дополнительно объяснить, как получить отдельные значения параметров в файле.

   foreach($line in Get-Content .\file_input) { #Loop though each line of the file
        if ($line.Contains("=") { #If the line contains "=" then we know that the line contains a parameter
            $splittedLine = $line.Split("=") #We know that the parameter line can be split at "=" to get parameter type and value of parameter
            $type = $splittedLine[0] #First part of line contains the type
            switch($type) { #Lets switch on the type to handle each type accordingly
                ";Date"{ #Here we have the Date type
                    $date = $splittedLine[1]
                }
                ";Class_1"{ #Here we have the Class_1 type
                    $class1 = $splittedLine[1]
                }
                ";Phone_Number"{ #Here we have the Phone_Number type
                    $phoneNum = $splittedLine[1]
                }
                ";School"{ #Here we have the School type
                    $school = $splittedLine[1]
                }
                ";ID"{ #Here we have the ID type
                    $id = $splittedLine[1]
                }
            }
        }
    }
0 голосов
/ 29 марта 2019

Вы можете сказать своей программе, что если она обнаружит Class_1 в скрипте, возьмите данные после =.

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