Как выбрать конкретную длину подстроки на основе фильтра - PullRequest
0 голосов
/ 24 января 2019

У меня есть несколько файлов CSV с разными именами, которые содержат сегодняшнюю дату, номер клиента и затем расширение. Например:

2019-01-23 XYZF-105.csv
2019-01-23 ABCD-205.csv
2019-01-23 Different nonstandard name.csv
2019-01-23 ##ABCD-305(Trial).csv

Я хотел бы получить часть имени, где он содержит только номер клиента, например ABCD-305.

Попытка использовать подстроку для выбора 8 символов прямо из точки, но это не работает для тех, у которых есть суффикс, например (Trial). Также он не работает с 11 символов с самого начала, так как он будет содержать ##. Также нужно избегать нестандартных названий.

Я использовал

$allitems = Get-ChildItem -Path 'C:\Downloads\Customers\*.csv'
$res = @()
foreach ($item in $allitems){
    $item = $item.Name.substring($item.Name.Length - 12,8)
    $res += $Item
}

Таким образом, для собственных имен я получаю хорошие результаты, но только если имя CSV-файла похоже на 2019-01-23 ABCD-205.csv.

Каким должен быть способ пропустить дату, пропустить расширение .csv и получить только результаты с 8 символами, которые имеют тире после 4-го символа? Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Попробуйте следующее (синтаксис PSv3 +):

$res = (Get-ChildItem -Path C:\Downloads\Customers\*.csv).Name | 
         Select-String -CaseSensitive '\b[A-Z]{4}-\d{3}\b' |
           ForEach-Object { $_.Matches[0].Value }
  • (Get-ChildItem -Path C:\Downloads\Customers\*.csv).Name выводит имена файлов всех файлов CSV в dir. C:\Downloads\Customers

  • Select-String -CaseSensitive '\b[A-Z]{4}-\d{3}\b' использует регистрозависимое регулярное выражение, учитывающее регистр, для выбора только тех имен файлов, которые содержат 4 ({4}) заглавных буквы. [A-Z], затем -, за которыми следуют 3 цифры (\d), на границах слова (\b)

  • Затем блок сценария ForEach-Object выводит часть каждого совпадающего имени файла, которая соответствует регулярному выражению ($_.Matches[0].Value), так что только соответствующие части совпадающих имен файлов собираются в $res, как массив.

0 голосов
/ 24 января 2019

Это хорошее время для использования регулярных выражений. Смотри https://regex101.com/r/AH00n6/1

и поймите следующее регулярное выражение:

.*\s[#]*([A-Z]{4}-[0-9]{3}).*.csv

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

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