Как использовать условное выражение с регулярным выражением в PowerShell? - PullRequest
0 голосов
/ 16 февраля 2020

Есть около десяти строк данных. Для каждой строки данных я хочу указать, содержит ли эта строка цифры.

Как можно распечатать «да, эта строка имеет цифры» или «нет, эта строка не имеет цифр» для каждой строки, ровно один раз?

вывод:

thufir@dur:~/flwor/csv$ 
thufir@dur:~/flwor/csv$ pwsh import.ps1 
no digits

Name
----                                                                           
people…                                                                        

thufir@dur:~/flwor/csv$ 

код:

$text = Get-Content -Raw ./people.csv
[array]::Reverse($text)

$tempAttributes = @()
$collectionOfPeople = @()

ForEach ($line in $text) { 
  if($line -notmatch '.*?[0-9].*?') {
    $tempAttributes += $line 
    Write-Host "matches digits"   
  }
  else {
    Write-Host "no digits"   
    $newPerson = [PSCustomObject]@{
      Name       = $line
      Attributes = $tempAttributes
    }
    $tempAttributes = @()
    $collectionOfPeople += $newPerson
  }
}

$collectionOfPeople

данные:

people
joe
phone1
phone2
phone3
sue
cell4
home5
alice
atrib6
x7
y9
z10

Единственная причина, по которой я печатаю " цифры "или" без цифр "- это маркер, помогающий построить объект.

1 Ответ

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

Вы можете использовать следующее:

switch -regex -file people.csv {
    '\d' { "yes" ; $_ }
    default { "no"; $_ }
}

\d - это символ регулярного выражения, соответствующий di git. Оператор switch с -regex позволяет использовать выражения регулярных выражений для сопоставления текста. Условие default выбирается, когда не выполняется другое условие. $_ - текущая обрабатываемая строка.

switch обычно быстрее, чем Get-Content для построчной обработки. Поскольку вы действительно хотите выполнять определенные действия для каждой строки, вы, вероятно, не хотите использовать параметр -Raw, поскольку он будет считывать все содержимое файла как одну строку.


# For Reverse Output
$output = switch -regex -file people.csv {
    '\d' { "yes" ; $_ }
    default { "no"; $_ }
}
$output[($output.GetUpperBound(0))..0)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...