Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中解析时从文件数据获取最新记录(详细信息)_Perl - Fatal编程技术网

在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