无法提取新行中的Perl数据
我有一大组数据,这些数据来自于执行一些命令,我正在从这些数据中提取一些需要进一步处理的部分。到目前为止,我将它存储在一个散列无法提取新行中的Perl数据,perl,hash,file-io,Perl,Hash,File Io,我有一大组数据,这些数据来自于执行一些命令,我正在从这些数据中提取一些需要进一步处理的部分。到目前为止,我将它存储在一个散列%data\u散列中 这是我的剧本: #!/usr/bin/perl use strict; use warnings; use Data::Dumper; my %data_hash; my @data = <DATA> ; foreach my $data_line ( @data ){ chomp $data_line; if( $d
%data\u散列中
这是我的剧本:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my %data_hash;
my @data = <DATA> ;
foreach my $data_line ( @data ){
chomp $data_line;
if( $data_line =~ m/[0-9]{4}-[0-9]{2}-[0-9]{2}\;[0-9]{2}:[0-9]{2}:[0-9]{2}/){
my ($primary,$date,$time,$priority,$obj,$id,$text) = split(";", $data_line);
$data_hash{$primary}{$id}{'DateTime'} = $date." ".$time;
$data_hash{$primary}{$id}{'priority'} = $priority;
$data_hash{$primary}{$id}{'obj'} = $obj;
$data_hash{$primary}{$id}{'text'} = $text;
}
}
print Dumper(\%data_hash);
__DATA__
.......
.......
Pr1: Date;Time;Priority;Object;ID;OtherInfo
Pr1: 2019-11-21;15:30:54;Low;Obj1;1;No Info Provided
.......
.......
Pr2: Date;Time;Priority;Object;ID;OtherInfo
Pr2: 2019-11-22;10:30:00;High;Obj2;2;Line Missing
Pr2: 2019-11-20;11:01:01;Low;Obj3 is example obj;
5;No Info Provided
Pr2: 2019-11-20;05:10:10;High;Obj9;4;Line Missing
.......
.......
如果您看到散列转储程序,对于Pr2
,其中一个键被设置为unde
,因为输入文件中的数据(ID
)保存在新行中(实际上是前一行5的延续;未提供任何信息
)
在读取输入文件时,如何将此ID
作为Pr2
的键之一。以下是一个示例:
my %data_hash;
my $data = do { local $/; <DATA> };
while ($data =~ /
(\S+):\s([0-9]{4}-[0-9]{2}-[0-9]{2});
([0-9]{2}:[0-9]{2}:[0-9]{2});
([^;]+);
([^;]+);
([^;]+);
([^;\n]+) /gx){
my ($primary,$date,$time,$priority,$obj,$id,$text)
= map { s/^\s+|\s+$//gr } @{^CAPTURE};
$data_hash{$primary}{$id}{'DateTime'} = $date." ".$time;
$data_hash{$primary}{$id}{'priority'} = $priority;
$data_hash{$primary}{$id}{'obj'} = $obj;
$data_hash{$primary}{$id}{'text'} = $text;
}
您可以简单地阅读和附加行,直到您有七个“
您如何知道一行上的数据在下一行继续?例如,如果一行上的字段数小于7,是否总是有连续行?@HåkonHægland yes。对于所有数据,应该有7个字段。好的,一个文件行上也可能有多个数据行,例如,一个包含14个字段的行可以定义两个数据行,或者一行有8个字段可以定义一行的最后4个项目,下一行的前4个项目?@HåkonHægland No.单个数据行最多只能有7个字段。我已经更新了问题(数据处理程序中的输入文件)。格式略有不同。是的,每个数据行最多有7个字段。现在在第一个字段中有一个冒号:Pr1:Date
。那是打字错误吗?应该是分号,对吧?不是打字错误Pr1:Date
或Pr1:2019-11-21
是实际数据。好的,那么每行只有6个字段?准确地说。这看起来像是Pr1:Date;时间优先;对象身份证件其他信息
。Pr1:
和Date
之间有一个空格。
my %data_hash;
my $data = do { local $/; <DATA> };
while ($data =~ /
(\S+):\s([0-9]{4}-[0-9]{2}-[0-9]{2});
([0-9]{2}:[0-9]{2}:[0-9]{2});
([^;]+);
([^;]+);
([^;]+);
([^;\n]+) /gx){
my ($primary,$date,$time,$priority,$obj,$id,$text)
= map { s/^\s+|\s+$//gr } @{^CAPTURE};
$data_hash{$primary}{$id}{'DateTime'} = $date." ".$time;
$data_hash{$primary}{$id}{'priority'} = $priority;
$data_hash{$primary}{$id}{'obj'} = $obj;
$data_hash{$primary}{$id}{'text'} = $text;
}
$VAR1 = {
'Pr1' => {
'1' => {
'DateTime' => '2019-11-21 15:30:54',
'text' => 'No Info Provided',
'obj' => 'Obj1',
'priority' => 'Low'
}
},
'Pr2' => {
'5' => {
'DateTime' => '2019-11-20 11:01:01',
'obj' => 'Obj3 is example obj',
'text' => 'No Info Provided',
'priority' => 'Low'
},
'4' => {
'obj' => 'Obj9',
'text' => 'Line Missing',
'DateTime' => '2019-11-20 05:10:10',
'priority' => 'High'
},
'2' => {
'priority' => 'High',
'obj' => 'Obj2',
'text' => 'Line Missing',
'DateTime' => '2019-11-22 10:30:00'
}
}
};
my $data_line= '';
foreach my $line ( @data ){
chomp $line;
$data_line.= $line;
my ($primary,$date,$time,$priority,$obj,$id,$text) = split(";", $data_line);
next unless defined $text;
# your stuff here
$data_line= '';
}