Возникли проблемы при фильтрации массива списка папок - PullRequest
0 голосов
/ 02 октября 2018

У меня есть список имен папок, он длиннее миллиона строк, но выглядит он так ...

\\HOSTNAME\c$\Docs\PROD\10009991\BILLS\2018                                                                                                                  
\\HOSTNAME\c$\Docs\PROD\10009993\BILLS                                                                                                                       
\\HOSTNAME\c$\Docs\PROD\10009993\BILLS\2014                                                                                                                  
\\HOSTNAME\c$\Docs\PROD\10009993\BILLS\2015                                                                                                                  
\\HOSTNAME\c$\Docs\PROD\10009993\BILLS\2016                                                                                                                  
\\HOSTNAME\c$\Docs\PROD\10009995\BILLS                                                                                                                    
\\HOSTNAME\c$\Docs\PROD\10009995\BILLS\2014                                                                                                                  
\\HOSTNAME\c$\Docs\PROD\10009995\BILLS\2015                                                                                                                  
\\HOSTNAME\c$\Docs\PROD\10009996\BILLS                                                                                                                       
\\HOSTNAME\c$\Docs\PROD\10009996\BILLS\2014                                                                                                                  
\\HOSTNAME\c$\Docs\PROD\10009996\BILLS\2015                                                                                                                  
\\HOSTNAME\c$\Docs\PROD\10009996\BILLS\2016                                                                                                                  
\\HOSTNAME\c$\Docs\PROD\10009996\BILLS\2017                                                                                                                  
\\HOSTNAME\c$\Docs\PROD\10009996\BILLS\2018                                                                                                                  
\\HOSTNAME\c$\Docs\PROD\10010006\10006                                                                                                                       
\\HOSTNAME\c$\Docs\PROD\10010006\BILLS                                                                                                                       
\\HOSTNAME\c$\Docs\PROD\10010006\10006\BILLS                                                                                                                 
\\HOSTNAME\c$\Docs\PROD\10010006\10006\BILLS\2013                                                                                                            
\\HOSTNAME\c$\Docs\PROD\10010006\10006\BILLS\2015                                                                                                            
\\HOSTNAME\c$\Docs\PROD\10010006\10006\BILLS\2016                                                                                                            
\\HOSTNAME\c$\Docs\PROD\10010006\10006\BILLS\2017                                                                                                            
\\HOSTNAME\c$\Docs\PROD\10010006\10006\BILLS\2018                                                                                                            
\\HOSTNAME\c$\Docs\PROD\10010006\BILLS\2013                                                                                                                  
\\HOSTNAME\c$\Docs\PROD\10010006\BILLS\2015                                                                                                                  
\\HOSTNAME\c$\Docs\PROD\10010006\BILLS\2016                                                                                                                  
\\HOSTNAME\c$\Docs\PROD\10010006\BILLS\2017                                                                                                                  
\\HOSTNAME\c$\Docs\PROD\10010009\10009                                                                                                                       
\\HOSTNAME\c$\Docs\PROD\10010009\BILLS                                                                                                                       
\\HOSTNAME\c$\Docs\PROD\10010009\10009\BILLS                                                                                                                 
\\HOSTNAME\c$\Docs\PROD\10010011\10011                                                                                                                       
\\HOSTNAME\c$\Docs\PROD\10010011\BILLS                                                                                                                       
\\HOSTNAME\c$\Docs\PROD\10010011\10011\BILLS                                                                                                                 
\\HOSTNAME\c$\Docs\PROD\10010013\10013                                                                                                                       
\\HOSTNAME\c$\Docs\PROD\10010013\BILLS                                                                                                                       
\\HOSTNAME\c$\Docs\PROD\10010013\10013\BILLS                                                                                                                 
\\HOSTNAME\c$\Docs\PROD\10010013\10013\BILLS\2015                                                                                                            
\\HOSTNAME\c$\Docs\PROD\10010013\10013\BILLS\2016                                                                                                            
\\HOSTNAME\c$\Docs\PROD\10010013\10013\BILLS\2017                                                                                                            
\\HOSTNAME\c$\Docs\PROD\10010013\10013\BILLS\2018                                                                                                            
\\HOSTNAME\c$\Docs\PROD\10010013\BILLS\2015                                                                                                                  
\\HOSTNAME\c$\Docs\PROD\10010013\BILLS\2016                                                                                                                  
\\HOSTNAME\c$\Docs\PROD\10010013\BILLS\2017                                                                                                                  
\\HOSTNAME\c$\Docs\PROD\10010014\10014                                                                                                                       
\\HOSTNAME\c$\Docs\PROD\10010014\BILLS                                                                                                                       
\\HOSTNAME\c$\Docs\PROD\10010014\10014\BILLS                                                                                                                 
\\HOSTNAME\c$\Docs\PROD\10010014\10014\BILLS\2015                                                                                                            
\\HOSTNAME\c$\Docs\PROD\10010014\10014\BILLS\2016                                                                                                            
\\HOSTNAME\c$\Docs\PROD\10010014\10014\BILLS\2017                                                                                                            
\\HOSTNAME\c$\Docs\PROD\10010014\BILLS\2015 

В основном, я ищу несколько идентификаторов клиентов, где естьне папка BILLS после 8-значного номера учетной записи.

Так что она должна вернуть следующую строку, например:

\HOSTNAME\c$\Docs\PROD\10010006\10006\BILLS

Я понимаю, что будет много дубликатов.В конечном итоге я просто хочу получить список учетных записей, в которых присутствует старая подпапка с номером счета.Это то, что я имею до сих пор, и это не работает.Он просто распечатывает весь список.

$list = Get-Content "sample.txt"
foreach ($i in $list){
    $parts = $i -split '\\'
    if ($parts[7] -notlike '%Bills%'){
        Write-Host $parts
    }
}

Ответы [ 4 ]

0 голосов
/ 02 октября 2018

Действительно, ваша основная проблема ошибочно использовала % вместо * в качестве метасимвола подстановки с любой последовательностью символов, включая ни одного.

Однакоесть других вещей, которые стоит улучшить :

  • При работе с большими файлами не используйте $list = Get-Content "sample.txt" для чтения массива строк в память сразу - вместо этого используйте конвейер PowerShell для обработки строк одна за другой путем передачи в командлет ForEach-Object.

  • Не используйте Write-Host для вывода результатов ;при этом выполняется запись только в консоль , и вы не сможете получить данные для последующей обработки;вместо этого используйте Write-Output или, предпочтительно, используйте неявный вывод.

  • Вам не нужно строгое выражение с подстановочными знаками , соответствующее компоненту пути BILLS - всевам нужно обрезать конечные пробелы с конца перед использованием литерал сравнение строк с 'BILLS'.

Чтобы сложить все вместе:

Get-Content sample.txt | ForEach-Object {
  $parts = $_ -split '\\'
  if ($parts[7].TrimEnd() -ne 'BILLS') { $parts[6] }
}

$parts[6] - это номер счета - обратите внимание, что, не присваивая его переменной или перенаправляя в другое место, он неявно выводит , так что цикл возвращает только номера счетов, в соответствии с запросом.


Вышеуказанное является эффективным с точки зрения памяти, но потенциально медленным .Если это проблема, прочитайте строки, используя .NET Framework напрямую.

[IO.File]::ReadLines("$PWD/sample.txt") | ForEach-Object {
  $parts = $_ -split '\\'
  if ($parts[7].TrimEnd() -ne 'BILLS') { $parts[6] }
}
0 голосов
/ 02 октября 2018

ОК, так что вы можете использовать некоторое регулярное выражение.Цель состоит в том, чтобы получить все строки, которые не имеют названия счета после 8 цифр

Get-Content "C:\Test\Fast Build\Bills_Test.txt" | ?{$_ -notmatch "[0-9]{8}.BILLS"}

Давайте рассмотрим, что здесь происходит

Мы получаем-контент файла, Затем мы последовательно | передаем вывод Where-Object псевдоним ? .Затем мы проверяем использование оператора -notmatch (Match в powershell проверяет aginst Regex, Like проверяет aginst wildcards).В регулярном выражении мы ищем все, что не имеет 8 цифр и [0-9] {8} и подстановочного знака . с BILLS .

0 голосов
/ 02 октября 2018

Исходя из приведенных выше данных, это

$list -split "`r?`n" | Select-String -Pattern '(?<=\\)\d{8}(?!\\BILLS)'|
  ForEach-Object {$_.Matches.Groups[0].Value} | 
    Sort-Object -Unique

Возвращает:

10010006
10010009
10010011
10010013
10010014

Используя регулярное выражение с не потребляющим положительным взглядом позади (?<=\\) и
негативный взгляд в будущее (?!\\BILLS)

0 голосов
/ 02 октября 2018

Так что я нашел ответ в другом месте и чтобы избежать мема XKCD DenverCoder9 ...

Моя проблема заключалась в том, что в Powershell * это подстановочный знак, а не%.

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