Получить подстроку значения при использовании import-Csv в PowerShell - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть сценарий PowerShell, который импортирует файл CSV, отфильтровывает строки из двух столбцов, а затем объединяет строку и экспортирует в новый файл CSV.

Import-Csv "redirect_and_canonical_chains.csv" |
Where { $_."Number of Redirects" -gt 1} |
Select {"Redirect 301 ",$_.Address, $_."Final Address"} |
Export-Csv "testing-export.csv" –NoTypeInformation 

Однако все это прекрасно работает за $_.Address value Я хочу удалить домен, поддомен, протокол и т. Д., Используя следующее регулярное выражение

^(?:https?:\/\/)?(?:[^@\/\n]+@)?(?:www\.)?([^:\/\n]+)

Это работает индивидуально и соответствует, как я хочу, но я не уверен, что лучший способ реализовать, когдавыбор данных (следует ли использовать $ match, -relace и т. д.) или мне следует сделать это после импорта?

Любой совет, который очень важен!

Большое спасибо

Майк

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Лучше всего сделать это в предложении select, например:

select Property1,Property2,@{name='NewProperty';expression={$_.Property3 -replace '<regex>',''}}

Вот что такое вычисляемое свойство: вы даете имя и способ его создания. Ваше регулярное выражение можеттребуется ревизия для работы с PowerShell.

0 голосов
/ 11 марта 2019

Основываясь на последующих комментариях, цель вашего вызова Select[-Object] заключалась в создании отдельной строки с разделенными пробелами записями для каждого входного объекта.

Обратите внимание, что использованиеExport-Csv тогда не имеет смысла, потому что он создаст один столбец Length с входными строками ' length вместо вывода самих строк.

В последующем комментарии выопубликовал решение, которое использовало Write-Host для создания выходной строки, но Write-Host, как правило, не подходит для использования , если только намерение явно не записать только для отображения ,тем самым обходя потоки вывода PowerShell и, следовательно, возможность отправлять вывод другим командам, записывать его в переменную или перенаправлять в файл.

Вот фиксированная версия вашей команды, в которой используется оператор -joinобъединить элементы массива строк для вывода одной строки, разделенной пробелами:

$sampleCsvInput = [pscustomobject] @{ 
  Address = 'http://www.example.org/more/stuff'; 
  'Final Address' = 'more/stuff2'
}

$sampleCsvInput | ForEach-Object { 
  "Redirect 301 ", 
  ($_.Address -replace '^(?:https?://)?(?:[^@/\n]+@)?(?:www\.)?([^:/\n]+)', ''), 
  $_.'Final Address' -join ' ' 
}

Обратите внимание, что , - оператор построения массива PowerShell -имеет более высокий приоритет, чем оператор -join, поэтому операция -join действительно объединяет все 3 предыдущих элемента массива.

Приведенное выше возвращает следующую строку:

Redirect 301  /more/stuff more/stuff2
0 голосов
/ 26 февраля 2019

Теперь я понял, что могу просто использовать .Заменить следующим образом:)

Select {"Redirect 301 ",$_.Address.Replace('http://', 'testing'), $_."Final Address"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...