【发布时间】:2020-05-08 06:57:53
【问题描述】:
我需要一些关于我的正则表达式的帮助。
我的代码看起来像这样(我还没有走多远):
$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
文件如下所示:
我能够使用我的正则表达式从上图顶部以红色圈出的“帐户活动 - 人的姓名”字符串中获取名字和姓氏。
我的最终目标是能够将蓝色框作为匹配项进行正则表达式,获取从左上角的日期到“每小时工作 1 个帐户”的所有信息。然后我想从第二个红色圆圈中获取信息。我想在该行的开头获取开始时间,然后找到同一行“Start account 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
【问题讨论】:
-
我会在
date.. [lots of spaces] ...company name行上拆分以获取单独的记录。然后针对结果记录进行正则表达式。它可以大大简化你的模式。 -
这些行在这个文件中到处都是,而且是随机的,这使得它不太有效。所以我试图一次做整个部分。
-
此视频可能对您有所帮助Sophisitcated Techniques of Plain Text Parsing。请务必观看到最后。
-
@shadow2020 - 如果您的文本不规则,您将需要一个真正的正则表达式大师 [也许还有一些彻底的魔法] 来解析该文本。祝你好运……你可能需要它! [咧嘴一笑]
-
我知道!谢谢你,先生!当您需要正则表达式忍者时,他们在哪里?
标签: regex powershell