【问题标题】:Perl Parsing Script IssuesPerl 解析脚本问题
【发布时间】:2014-12-07 09:12:27
【问题描述】:

要解析的示例文本文件:

DEG01297D 2014 年 10 月 1 日星期三 00:49:13 DEG02522D 上周三 10 月 1 日 00:50:46 2014 DEG01297D 下周三 10 月 1 日 00:54:14 2014 DEG02522D 下周三 10 月 1 日 00:55:20 2014

渴望

SITEID 状态 日期 时间 状态 日期 时间 正常 时间 DEG01297D 上周三 10 月 1 日 0:49:13 下周三 10 月 1 日 0:54:14 0:05:01 DEG02522D 上周三 10 月 1 日 0:50:46 下周三 10 月 1 日 0:55:20 0:04:34

代码:

$infile='Test';
$outfile='asqf.txt';
open(INPUT, $infile);
@data = < INPUT >;
close(INPUT);

open(OUTPUT, ">$outfile");
$siteid="";
$status="";
$timeU="";
$timeU="";

for ($i=0; $i <= $#data; ++$i)
{

    @line=split(/\t/,$data[i]);

    if (($line[1] =~ /  Up/))
    {
        $siteid=$line[0];
        print OUTPUT "\n$siteid,";
        $status=$line[1];
        print OUTPUT " $status, ";
        $timeU=$line[2];
        print OUTPUT " $timeU, ";
        $z=$i+1;        

    }

    #for ($x=$z; $x <=$#data; ++$x)
    #{
    #   if (($line[2] =~ /Down/) && ($line[0] == $siteid))
    #   {
    #       $status=$line[2];
    #       print OUTPUT " $status, ";
    #       $timeD=$line[3];
    #       print OUTPUT " $timeD, ";
    #   }
    #   $x=$#data;          
    #}

}

close(OUTPUT);

当前状态

散列部分是在故障排除期间完成的。当我在当前演示文稿中运行脚本时,我没有得到任何输出。我在第 16 行做某事吗,第一个 for 循环的第一行。

Perl 初学者,好久没写代码了,随便

【问题讨论】:

    标签: perl parsing text


    【解决方案1】:

    我认为您应该使用匿名哈希来存储 $data

    use strict;
    use warnings;
    use Date::Parse;
    
    my $data = {};
    
    sub dateDiff{
      my ($d1,$d2) = @_;
      return (str2time($d2) - str2time($d1));
    }
    
    open(DATA,"data1.dat") || die $!;
    while(my $l = <DATA>){
      chomp($l);
      if($l =~ m/^(\S+)\s+(Up|Down)\s+(.*)$/){
        $data->{$1}->{$2} = $3;
      } else {
        # print the line with errors or log it
      }
    }
    close(DATA);
    
    print "SITEID\t\tSTATE\tDATE TIME\t\t\tSTATE\t DATE TIME\t\t\tUP\tTIME\n";
    foreach my $k1 (keys %{$data}){
      print $k1 . "\t";
      if(defined($data->{$k1}->{"Up"}) && defined($data->{$k1}->{"Down"})){
        print "Up\t" . $data->{$k1}->{"Up"} . "\tDown\t" . $data->{$k1}->{"Down"} 
           . "\tUp\t" . dateDiff($data->{$k1}->{"Up"},$data->{$k1}->{"Down"})."\n";
      }else{
        # print the part line as you need
      }
    }
    

    输出以秒为单位,如果需要,您可以使用任何从纪元到日期时间的方式以其他格式查看该秒数。

    【讨论】:

    • 谢谢你!不幸的是,由于我缺乏 Perl 知识,这看起来非常复杂。不过谢谢!!
    【解决方案2】:

    迭代每一行。 Tie Down 状态与之前看到的 Up 状态。最后输出所有结果:

    use strict;
    use warnings;
    
    use Time::Piece;
    
    my @data = [ qw(SITEID STATE DATE TIME STATE DATE TIME), 'UP TIME' ];
    my %siteids;
    
    while (<DATA>) {
        chomp;
        my ( $siteid, $state, $datetime ) = split /\s{4,}/;    # For actual data use /\t/;
        my $tp = Time::Piece->strptime( $datetime, '%a %b %e %T %Y' );
    
        if ( $state eq 'Up' ) {
            if ( $siteids{$siteid} ) {
                warn "Second Up state found before Down on line $.: $_\n";
            }
    
            push @data, my $data = [ $siteid, $state, $tp->strftime('%a %b %e'), $tp->strftime('%T') ];
    
            $siteids{$siteid} = {
                data => $data,
                tp   => $tp,
            };
    
        } elsif ( $state eq 'Down' ) {
            if ( !$siteids{$siteid} ) {
                warn "Down state found before Up on line $.: $_\n";
    
            } else {
                my $diff = $tp - $siteids{$siteid}{tp};
                push @{ $siteids{$siteid}{data} }, $state, $tp->strftime('%a %b %e'), $tp->strftime('%T'), $diff->pretty;
                delete $siteids{$siteid};
            }
    
        } else {
            warn "Unrecognized state on line $.: $_\n";
        }
    }
    
    print join( "\t", @$_ ), "\n" for @data;
    
    __DATA__
    DEG01297D    Up      Wed Oct  1 00:49:13 2014
    DEG02522D    Up      Wed Oct  1 00:50:46 2014
    DEG01297D    Down    Wed Oct  1 00:54:13 2014
    DEG02522D    Down    Wed Oct  1 00:55:20 2014
    

    输出:

    SITEID  STATE   DATE    TIME    STATE   DATE    TIME    UP TIME
    DEG01297D   Up  Wed Oct  1  00:49:13    Down    Wed Oct  1  00:54:13    5 minutes, 0 seconds
    DEG02522D   Up  Wed Oct  1  00:50:46    Down    Wed Oct  1  00:55:20    4 minutes, 34 seconds
    

    【讨论】:

    • 感谢米勒的帮助!你在哪里打开文件?假设我的文件是 Test.txt。另外,作为一个学习练习,你能指出我做错了什么吗?
    • 我没有打开文件,而是使用 *DATA 句柄来处理您建议的假数据。
    猜你喜欢
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 2018-07-05
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    相关资源
    最近更新 更多