Powershell Распечатка только определенного раздела линий - PullRequest
0 голосов
/ 08 октября 2019

Я вижу много слов "захватить последнее слово", "захватить первые / последние символы X" или "захватить строки, содержащие XXX", однако мне не удалось найти решение для моей проблемы здесь. Например, мой текстовый файл содержит строку, подобную

[0000001] item_title apple_juice_2L_concentrate 0x000581
[0000002] item_description 98%_reconstituted_apple_juice 0x00585
[0000003] item_title orange_juice_2L_natural 0x000679
[0000004] item_description 100%_fresh_squeeze_orange_juice 0x00985
[0000005] item_title apple_juice_1L_natural 0x000429
[0000006] item_description 100%_natural_apple_juice_cloudy 0x00587

, как бы я мог получить такую ​​распечатку, вырезая ненужный мусор, например, [0000001] и 0x000581

apple_juice_2L_concentrate
apple_juice_1L_natural
* 1006? * Я сейчас использую:
Get-Content -Path H:\"inventory management"\juice\juices.txt | Where-Object {$_ -like '*item_title apple_juice*'}

, который возвращает

[0000001] item_title apple_juice_2L_concentrate 0x000581
[0000005] item_title apple_juice_1L_natural 0x000429

Цените ваше время!

Симпатичная картинка для справки. https://imgur.com/fSRaH4R.png

Ответили на свой вопрос с помощью других ответов здесь.

Ответы [ 5 ]

1 голос
/ 08 октября 2019

Просто чтобы предложить другую перспективу, используя Select-String:

(Select-String -Path 'H:\inventory management\juice\juices.txt' -pattern "(?<=item_title\s*)apple_juice[^\s]*").Matches.Value

Это можно изменить, чтобы разрешить переменные:

$category = 'item_title'
$juice = 'apple_juice'
(Select-String -Path 'H:\inventory management\juice\juices.txt' -pattern "(?<=$category\s*)$juice[^\s]*").Matches.Value
1 голос
/ 08 октября 2019

Для справки, ответ, который должен был быть предоставлен:

$InStuff = Get-Content -Path 'H:\inventory management\juice\juices.txt' 

$TargetPhrase = 'item_title'

$Results = $InStuff -match $TargetPhrase |
    ForEach-Object {
        $_.Split(' ')[2]
        }

$Results -match 'apple_juice'
1 голос
/ 08 октября 2019

это использует строковый метод .Split() для разделения на пробелы, затем захватывает 3-й элемент [index = 2, так как массивы начинаются с @ 0]. наконец, он помещает это в коллекцию $Results. Вы можете использовать всю эту коллекцию ИЛИ отфильтровать ее с помощью $Results -match 'apple', чтобы получить предметы, в которых есть яблоко.

# fake reading in a text file
#    in real life, use Get-Content
$InStuff = @'
[0000001] item_title apple_juice_2L_concentrate 0x000581
[0000002] item_description 98%_reconstituted_apple_juice 0x00585
[0000003] item_title orange_juice_2L_natural 0x000679
[0000004] item_description 100%_natural_apple_juice_cloudy 0x00985
[0000005] item_title apple_juice_1L_natural 0x000429
[0000006] item_description 100%_natural_apple_juice_cloudy 0x00585
'@ -split [System.Environment]::NewLine

$TargetPhrase = 'item_title'

$Results = $InStuff -match $TargetPhrase |
    ForEach-Object {
        $_.Split(' ')[2]
        }

$Results
'=' * 20
# if you want only the apple items
$Results -match 'apple'

output ...

apple_juice_2L_concentrate
orange_juice_2L_natural
apple_juice_1L_natural
====================
apple_juice_2L_concentrate
apple_juice_1L_natural

вот альтернативный способ, который делает то же самое, но использует часть кода OP, так как он отказывается оставить это неловкое,ошибочный метод. [ ухмылка ] это предполагает, что файл был загружен с Get-Content в переменную $InStuff. если вы действительно хотите, чтобы все было разбито на одну строку ... вы можете сделать это довольно глупо, если хотите.

$TargetPhrase = 'item_title apple'
$InStuff |
    Where-Object {
        $_ -match $TargetPhrase
        } |
    ForEach-Object {
        $_.Split(' ')[2]
        }

output ...

apple_juice_2L_concentrate
apple_juice_1L_natural
1 голос
/ 08 октября 2019

Я предлагаю вам решение:

Get-Content "c:\temp\test.txt" | 
    ConvertFrom-Csv -Delimiter ' ' -Header ID, RowType, Libelle, Reference  | 
        where {$_.RowType -eq 'item_title' -AND $_.Libelle -match 'apple_juice'} | select Libelle
1 голос
/ 08 октября 2019

Ваша цель - получить название элемента из первой строки и описание элемента из строки после него? Если это то, что вы хотите сделать, вот пример:

# Sample data; replace this with Get-Content, etc.
$inputData = @"
[0000001] item_title apple_juice_2L_concentrate 0x000581
[0000002] item_description 98%_reconstituted_apple_juice 0x00585
[0000003] item_title orange_juice_2L_natural 0x000679
[0000004] item_description 100%_fresh_squeeze_orange_juice 0x00985
[0000005] item_title apple_juice_1L_natural 0x000429
[0000006] item_description 100%_natural_apple_juice_cloudy 0x00587
"@ -split [Environment]::NewLine

for ( $i = 0; $i -lt $inputData.Count; $i++ ) {
  if ( $inputData[$i] -match ' item_description ' ) {
    [PSCustomObject] @{
    "item_title"       = [Regex]::Match($inputData[$i - 1],' item_title (.+) 0x').Groups[1].Value
    "item_description" = [Regex]::Match($inputData[$i],' item_description (.+) 0x').Groups[1].Value
    }
  }
}

Вывод:

item_title                 item_description
----------                 ----------------
apple_juice_2L_concentrate 98%_reconstituted_apple_juice
orange_juice_2L_natural    100%_fresh_squeeze_orange_juice
apple_juice_1L_natural     100%_natural_apple_juice_cloudy

Этот шаблон предполагает, что во входе есть строка, содержащая строку item_descriptionи что строка перед ним содержит строку item_title.

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