在Perl中解析时从文件数据获取最新记录(详细信息)
我有一个节点的报警数据,它存储在一个文件中 文件内容如下:在Perl中解析时从文件数据获取最新记录(详细信息),perl,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#Frequen
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年对eventId=118382的报警执行的所有操作
我需要从该报警数据中选择每个报警的最新时间
这是我的密码:
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, limit\n";
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'}, $limit\n";
}
由于您的记录是由空行分隔的,所以只需读取由空行分隔的数据块即可。“段落模式”(
$/=”;
)使这变得微不足道
my%已选定;
{
本地$/=”;
while(my$row=){
我的%行=
映射{split/:/,$,2}
拆分/\n/,$row;
my$id=$row{eventId};
$selected{$id}=\%行
如果!$selected{$id}
||$row{lastUpdated}gt$所选{$id}{lastUpdated}
||$row{lastUpdated}eq$已选择{$id}{lastUpdated}&$row{Priority}eq'已清除';
}
}
对于我的$eventId(键(%selected)){
my$row=$selected{$eventId};
我的%addi=
映射{split/:/,$,2}
拆分/\ \ \/,$row->{additionalInformation};
说
加入“,”,
$row->{eventId},
$row->{Priority},
$row->{lastUpdated},
$addi{频率限制};
}
通过对数据进行假设,您可以更快地退出循环,从而加快速度。请调查以下演示代码是否符合您的问题
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
s的报警,该怎么办?如何迭代?我的意思是我怎么会有外套?啊,是的。因为最后我需要将这些数据写入csv文件。如前所述,对于单个eventId
single记录,是的,我提到的示例是针对一个记录的。但是我也提到了如果我有多个报警,对于每个报警,我们将有不同的eventId
编号。因此,寻找一种适用于不同EventID的逻辑。使用上面的解决方案是否也可以这样做?当我进行测试时,我交换了输入记录。即使特定的eventId
的数据是交换的,它也应该始终在lastUpdated字段中取出最新日期的数据。由于我们没有在脚本中执行此检查,因此它总是为我们提供特定eventId
的最后一条记录,这是不正确的。谢谢。但是,当我在“数据”的开头添加了一组数据,并带有lastUpdate:2020-09-09T14:34:13
的eventId:118382
的清除优先级时,它应该显示这个值,但不幸的是,它没有。@ikegami——你是说OP不够聪明,无法根据eventId键从散列值中进行选择吗?好的,我为这种情况修改了代码。不。我已经厌倦了牵着你的手。@ikegami-当我看到你的一些代码时,我会想‘为什么这个家伙做得这么复杂?’因为我的代码按照OP的要求做,而你的没有。我的代码和你的副本之间唯一真正的区别是缺少的部分。(我使用了比你更简单的表达式,比如常量字符串的简单拆分,而不是更重的正则表达式匹配。)
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