在Perl中进行解析时,从文件数据中获取最新记录(详细信息)



我有一个节点的报警数据,它存储在一个文件中。

以下是文件内容:

Priority : LOW
Node : NR001
Problem : FREQUENT Problem
eventTime : 2020-09-08T14:30:45
State : ACTIVE_UNACKNOWLEDGED
Id : 1071
Number : 1071
ceaseTime : null
ackTime : null
additionalInformation : Object:XYZ=NULL#Frequent_Limit:3#Filter_Time:1
insertTime : 2020-09-08T14:30:45
eventId : 118382
lastUpdated : 2020-09-08T14:30:45
Priority : LOW
Node : NR001
Problem : FREQUENT Problem
eventTime : 2020-09-08T14:30:45
State : ACTIVE_UNACKNOWLEDGED
Id : 1071
Number : 1071
ceaseTime : null
ackTime : null
additionalInformation : Object:XYZ=NULL#Frequent_Limit:3#Filter_Time:1
insertTime : 2020-09-08T14:30:45
eventId : 118382
lastUpdated : 2020-09-08T14:32:46
Priority : CLEARED
Node : NR001
Problem : FREQUENT Problem
eventTime : 2020-09-08T14:30:45
State : CLEARED_UNACKNOWLEDGED
Id : 1071
Number : 1071
ceaseTime : 2020-09-08T14:32:46
ackTime : null
additionalInformation : Object:XYZ=NULL#Frequent_Limit:3#Filter_Time:1
insertTime : 2020-09-08T14:30:45
eventId : 118382
lastUpdated : 2020-09-08T14:32:46

该数据属于一个报警,您可以看到所有eventId的值都是118382

如果我有多个警报,对于每个警报,我们将有不同的eventId编号。(在上面的例子中,我只有一个警报细节。(

以上数据显示了对2020-09-08事件Id为118382的警报执行的所有操作。

我需要从每个警报的最新lastUpated时间的警报数据中选择什么。

这是我的代码:

use strict;
use warnings;
use Data::Dumper;
$/ = "";
my %data;
while(<DATA>) {
my $rec = { split /n| : /, $_ };
$data{$rec->{eventId}} = $rec;
}
print Dumper %data;
my $limit = "NA";
print "eventId, priority, lastUpdated, limitn";
foreach my $e_id ( keys %data){

($limit = $1 ) if( $data{$e_id}{'additionalInformation'} =~ /Frequent_Limit:(d+)/);

print "$e_id, $data{$e_id}{'Priority'}, $data{$e_id}{'lastUpdated'}, $limitn";
}

我的脚本正在挑选关于特定键的最后一条记录。但是,我如何根据特定事件ID的lastUpdated日期获取数据。

此外,如果我对单个eventIdlastUpdated日期具有相同的值,那么它应该获取优先级为CLEARED的日期。

这里的输出应该是:

eventId, priority, lastUpdated, limit
118382,CLEARED,2020-09-09T14:34:13, 3

由于记录由空行分隔,因此只需读取由空行隔开的块即可"段落模式";($/ = "";(使得这变得微不足道。

my %selected;
{
local $/ = "";
while ( my $row = <> ) {
my %row =
map { split / : /, $_, 2 }
split /n/, $row;
my $id = $row{eventId};
$selected{$id} = %row
if !$selected{$id}
|| $row{lastUpdated} gt $selected{$id}{lastUpdated}
|| $row{lastUpdated} eq $selected{$id}{lastUpdated} && $row{Priority} eq 'CLEARED';
}
}
for my $eventId (keys(%selected)) {
my $row = $selected{$eventId};
my %addi =
map { split /:/, $_, 2 }
split /#/, $row->{additionalInformation};
say
join ",",
$row->{eventId},
$row->{Priority},
$row->{lastUpdated},
$addi{Frequent_Limit};
}

您可以通过对数据进行假设来更快地退出循环,从而加快速度。

请调查以下演示代码是否符合您的问题

use strict;
use warnings;
use feature 'say';
my $eventId = shift || '118382';
my %last_event;
my @fields  = qw/eventId Priority lastUpdated limit/;
my @records = do { local $/ = "", <DATA> };
for my $record ( @records ) {
my %event = ( $record =~ /^(.*?) : (.*)/mg );
next unless defined $event{eventId};
$event{limit} = $1 if $event{additionalInformation} =~ /Frequent_Limit:(d+)/;
$last_event{$event{eventId}} = %event;
}
say join ',', @fields;
say join ',', @{$last_event{$eventId}}{@fields};
__DATA__
Priority : LOW
Node : NR001
Problem : FREQUENT Problem
eventTime : 2020-09-08T14:30:45
State : ACTIVE_UNACKNOWLEDGED
Id : 1071
Number : 1071
ceaseTime : null
ackTime : null
additionalInformation : Object:XYZ=NULL#Frequent_Limit:3#Filter_Time:1
insertTime : 2020-09-08T14:30:45
eventId : 118382
lastUpdated : 2020-09-08T14:30:45
Priority : LOW
Node : NR001
Problem : FREQUENT Problem
eventTime : 2020-09-08T14:30:45
State : ACTIVE_UNACKNOWLEDGED
Id : 1071
Number : 1071
ceaseTime : null
ackTime : null
additionalInformation : Object:XYZ=NULL#Frequent_Limit:3#Filter_Time:1
insertTime : 2020-09-08T14:30:45
eventId : 118382
lastUpdated : 2020-09-08T14:32:46
Priority : CLEARED
Node : NR001
Problem : FREQUENT Problem
eventTime : 2020-09-08T14:30:45
State : CLEARED_UNACKNOWLEDGED
Id : 1071
Number : 1071
ceaseTime : 2020-09-08T14:32:46
ackTime : null
additionalInformation : Object:XYZ=NULL#Frequent_Limit:3#Filter_Time:1
insertTime : 2020-09-08T14:30:45
eventId : 118382
lastUpdated : 2020-09-08T14:32:46

输出

eventId,Priority,lastUpdated,limit
118382,CLEARED,2020-09-08T14:32:46,3

最新更新