форматирование объектов запроса в массив - PullRequest
0 голосов
/ 19 июня 2019

Мне нужно найти в файле отдельные символы (достаточно просто), но хотелось бы, чтобы они были в столбце таблицы с номером строки и индексом (место строки) в связанных столбцах.

Я пытался запускать запросы как в определенном массиве, так и вне его, но циклы for продолжают создавать вложенные массивы. Я нахожусь в конце моего PowerShell Foo.

$obj = @()
$obj += @{
    line = gc .\occurences.txt | select-string -Pattern 'r','a','r','e' -AllMatches | Select-Object LineNumber
    index = gc .\occurences.txt | select-string -Pattern 'r','a','r','e' -AllMatches | % { $_.Matches } | Select-Object Index
    value = gc .\occurences.txt | select-string -Pattern 'r','a','r','e' -AllMatches | % { $_.Matches } | % { $_.Value }
    }
$obj | format-list

токовый выход:

Name  : index
Value : {@{Index=66}, @{Index=20}}

Name  : value
Value : {e, r}

Name  : line
Value : {@{LineNumber=775}, @{LineNumber=925}}

But I would prefer something like:

Value    LineNumber     Index
e        775            66
r        925            20

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Спасибо AdminOfThings, ваш ответ очень близко подошел ко мне, но я все еще не смог правильно составить список индексов. Как только я понял, что могу удвоить метод, проблема с вложенным циклом была решена. Полный ответ ниже и еще раз спасибо!

$hit = Select-String -Path $file -Pattern 'r','e' -AllMatches | Foreach-Object{

New-Object -TypeName PSObject -Property @{
    LineNumber = $_.LineNumber
    Pattern = $_.Pattern
    Line = $_.Line
    Index = $_.matches.Index
    FileName = $_.Path
}
}
$hit | Format-Table -Wrap -Property Pattern,LineNumber,Index -AutoSize

Pattern LineNumber Index
------- ---------- -----
   e       775      66  
   r       925      20
0 голосов
/ 19 июня 2019

Вот один из способов сделать это:

$charMatches = Select-String -Path '.\occurences.txt' -Pattern 'r','a','r','e' -AllMatches
$charMatches | Foreach-Object { 
    $line = $_.Linenumber
    $_.Matches | Select-Object @{ n='Value'; e={ $_.Value }}
                 @{ n='Linenumber'; e={ $line }}
                 @{ n='Index'; e={ $_.Index }}
    }

Пояснение:

$charMatches хранит массив объектов MatchInfo. Из этих объектов у вас есть доступ к свойствам .LineNumber и .Matches. Свойство .Matches возвращает объект Match, который содержит другие свойства, такие как .Value и .Index.

Первый Foreach-Object обрабатывает каждый объект MatchInfo, что позволяет нам хранить .LineNumber в $line для всех совпадений, принадлежащих этому объекту.

Поскольку .Matches содержит массив, мы обработаем каждый из этих элементов массива в команду Select-Object, выбирая свойства, которые мы хотим вывести (Index и Value).

Здесь нет необходимости для Get-Content, поскольку вы можете передать файл в Select-String -Path.

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