Powershell сложное регулярное выражение powershell несколько групп - PullRequest
0 голосов
/ 07 мая 2020

Мне нужна помощь с моим регулярным выражением.

Мой код выглядит так (я не очень далеко зашел):

$source_file = "\\server\minified.txt"
$sf_content = gc $source_file -raw

$sections = $sf_content | select-string -AllMatches '(?smi)(^\s+\d+:\d+\s+AM\s+\w+\s+ACCOUNT ACTIVITY\s-\s)(\w+\s+\w+$)(.+?(Start Account\s\d+)(.+?Elapsed))'
$sections

Файл выглядит так:

source content example Мне удалось получить имя и фамилию с помощью моего регулярного выражения из строки «ACCOUNT ACTIVITY - PERSON'S NAMEHERE», обведенной красным в верхней части изображения, показанного выше.

Моя конечная цель - иметь возможность преобразовывать синюю рамку в соответствие, получая всю информацию от даты в верхнем левом углу до «1 учетных записей, работающих в час». Затем я хочу получить информацию из 2-го красного кружка. Я хотел бы получить время начала в начале этой строки, а затем найти последний экземпляр той же строки «Начальная учетная запись 54321234», чтобы я мог взять последний раз минус первый раз.

Итак, для каждого синего поля получите информацию из красных кружков. Для каждого красного кружка, содержащего «Начать учетную запись», возьмите синий кружок минус зеленый кружок.

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

Мой код не завершено. Но я не уверен, как делать регулярное выражение, поэтому буду обновлять его по мере обновления скрипта и проведения собственного исследования.

Если у кого-то есть указатели, я был бы признателен.

Вот исходный контент в текстовой форме:

   05/07/20                                                       Acme, Inc.                                                          PAGE 1
    9:48 AM  ABC                                          ACCOUNT ACTIVITY - Bart Simpson

The time ELAPSED since the previous line is printed as HOURS:MINUTES:SECONDS.
      DATE     TIME     ELAPSED   ACTION


    04/16/20  8:06:50      0:00   Enter Account Screen
-------------------------------------------------------------------------------
              8:06:53      0:03   Start account 12345678  ROSS, BOB N
              8:07:24      0:31   Finished account in 31 seconds
-------------------------------------------------------------------------------
              8:07:26      0:02   Start account 54321234  DOE, JOHN
              8:07:27      0:01   Finished account in 1 seconds
-------------------------------------------------------------------------------
              8:07:28      0:02   Start account 54321234  DOE, JOHN
              8:10:26      0:01   Finished account in 1 seconds
-------------------------------------------------------------------------------
    05/06/20  4:55:49      5:08   Leave Account Screen     9:33 Elapsed 
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
    05/06/20  4:55:55      0:06   Leave Account Screen
-------------------------------------------------------------------------------

                                      DAILY TOTALS
                        5:33:46 - Time on Account screen for the day.
                              3 Calls             1 Calls per hour
                              3 Contacts          1 Contacts per hour
                              3 Accounts worked   1 Accounts worked per hour
   05/07/20                                                       Acme, Inc.                                                          PAGE 1
    9:48 AM  ABC                                          ACCOUNT ACTIVITY - Lisa Simpson

The time ELAPSED since the previous line is printed as HOURS:MINUTES:SECONDS.
      DATE     TIME     ELAPSED   ACTION


    04/16/20  8:06:50      0:00   Enter Account Screen
-------------------------------------------------------------------------------
              8:06:53      0:03   Start account 6543212  DOE, JANE
              8:07:24      0:31   Finished account in 31 seconds
-------------------------------------------------------------------------------
              8:07:26      0:02   Start account 88888888  DEER, JOHN
              8:07:27      1:01   Finished account in 1 seconds
-------------------------------------------------------------------------------
    05/06/20  4:55:49      5:08   Leave Account Screen    10:33 Elapsed 
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
    05/06/20  4:55:55      0:06   Leave Account Screen
-------------------------------------------------------------------------------

                                      DAILY TOTALS
                        5:33:46 - Time on Account screen for the day.
                              3 Calls             1 Calls per hour
                              3 Contacts          1 Contacts per hour
                              3 Accounts worked   1 Accounts worked per hour

1 Ответ

1 голос
/ 08 мая 2020

Вы будете бороться с регулярным выражением. Кажется, лоскут повторяет вторую группу захвата. Некоторое время я пробовал добавлять метки для ваших подходящих совпадений, и я собирал только первые совпадения с помощью этого регулярного выражения. Любой, кто является «королем регулярных выражений», пожалуйста, отвернитесь.

(?smi)(^\s+\d+:\d+\s+(AM|PM)\s+\w+\s+ACCOUNT ACTIVITY\s-\s)(?<name>\w+\s+\w+$)(.+?(?<begin>\d+:\d+:\d+)(\s+\d:\d+\s+)(?<acctnumber>Start Account\s\d+)(\s+)(?<account>\w+,\s\w+(\s[A-za-z]|))\s+(?<end>.+?\d:\d+))

Вы можете предоставить шаблон, чтобы выбрать все поля, представляющие потенциальный интерес, и использовать ConvertFrom-String. Главное - пометить все элементы, которые вы хотите, уникальными фигурными скобками. Затем вам нужно пометить первый элемент в шаблоне звездочкой, поэтому, используя приведенный выше пример, у вас будет что-то вроде этого.

$template = @"
   05/07/20                                                       Acme, Inc.                                                          PAGE 1
    9:48 AM  ABC                                          ACCOUNT ACTIVITY - {customer*:Bart Simpson}

The time ELAPSED since the previous line is printed as HOURS:MINUTES:SECONDS.
      DATE     TIME     ELAPSED   ACTION


    04/16/20  8:06:50      0:00   Enter Account Screen
-------------------------------------------------------------------------------
              {begin1:8:06:53}      0:03   {accNum1:Start account 12345678}  {name1:ROSS, BOB N}
              {end1:8:07:24}      0:31   Finished account in 31 seconds
-------------------------------------------------------------------------------
              {begin2:8:07:26}      0:02   {accNum2:Start account 54321234}  {name2:DOE, JOHN}
              {end2:8:07:27}      0:01   Finished account in 1 seconds
-------------------------------------------------------------------------------
              {begin3:8:07:28}      0:02   {accNum3:Start account 54321234}  {name3:DOE, JOHN}
              {end3:8:10:26}      0:01   Finished account in 1 seconds
-------------------------------------------------------------------------------
    05/06/20  4:55:49      5:08   Leave Account Screen     9:33 Elapsed 
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
    05/06/20  4:55:55      0:06   Leave Account Screen
-------------------------------------------------------------------------------

                                      DAILY TOTALS
                        5:33:46 - Time on Account screen for the day.
                              3 Calls             1 Calls per hour
                              3 Contacts          1 Contacts per hour
                              3 Accounts worked   1 Accounts worked per hour
   05/07/20                                                       Acme, Inc.                                                          PAGE 1
    9:48 AM  ABC                                          ACCOUNT ACTIVITY - {customer*:Lisa Simpson}

The time ELAPSED since the previous line is printed as HOURS:MINUTES:SECONDS.
      DATE     TIME     ELAPSED   ACTION


    04/16/20  8:06:50      0:00   Enter Account Screen
-------------------------------------------------------------------------------
              {begin1:8:06:53}      0:03   {accNum1:Start account 6543212}  {name1:DOE, JANE}
              {end1:8:07:24}      0:31   Finished account in 31 seconds
-------------------------------------------------------------------------------
              {begin2:8:07:26}      0:02   {accNum2:Start account 88888888}  {name2:DEER, JOHN}
              {end2:8:07:27}      1:01   Finished account in 1 seconds
-------------------------------------------------------------------------------
              {begin3:\s}      0:02   {accNum3:\s}  {name3:\s}
              {end3:\s}      1:01   Finished account in 1 seconds
-------------------------------------------------------------------------------
    05/06/20  4:55:49      5:08   Leave Account Screen    10:33 Elapsed 
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
    05/06/20  4:55:55      0:06   Leave Account Screen
-------------------------------------------------------------------------------

                                      DAILY TOTALS
                        5:33:46 - Time on Account screen for the day.
                              3 Calls             1 Calls per hour
                              3 Contacts          1 Contacts per hour
                              3 Accounts worked   1 Accounts worked per hour
"@

В вашем последнем примере я добавил третий набор с пространство регулярного выражения в них, чтобы он не дублировал второй набор данных в наборе 3.

Затем вы можете передать весь ввод через командлет, используя параметр -TemplateContent для применения вашего шаблона. И вы должны получить данные с другой стороны.

$data = # Get your data
$data | ConvertFrom-String -TemplateContent $template

customer : Bart Simpson
begin1   : 8:06:53
accNum1  : Start account 12345678
name1    : ROSS, BOB N
end1     : 8:07:24
begin2   : 8:07:26
accNum2  : Start account 54321234
name2    : DOE, JOHN
end2     : 8:07:27
begin3   : 8:07:28
accNum3  : Start account 54321234
name3    : DOE, JOHN
end3     : 8:10:26

customer : Lisa Simpson
begin1   : 8:06:53
accNum1  : Start account 6543212
name1    : DOE, JANE
end1     : 8:07:24
begin2   : 8:07:26
accNum2  : Start account 88888888
name2    : DEER, JOHN
end2     : 8:07:27

Затем вы можете сравнить свои данные, перебирая выходные объекты.

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