Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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_Hash_File Io - Fatal编程技术网

无法提取新行中的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= '';
}