use strict; use warnings; #convert DDHHMM into int of m sub d2i { my( $d, $h, $m ) = unpack '(A2)*', $_[0]; return ( ( $d - 1 ) * 24 + $h ) * 60 + $m; } #convert int of m into DDHHMM sub i2d { sprintf "%02d%02d%02d", int($_[0]/1440)+1, int($_[0]/60)%24, $_[0]%60; } #find and open files ... only ever 1 of each file type my ($d,$t); foreach (<*>) { $d = $_ if (/\.dat$/); $t = $_ if (/\.mrg$/); } open(D, $d) or die "Unable to open DAT file. Exiting.\n"; my @dl = ; close(D); open(T, $t) or die "Unable to open MRG file. Exiting.\n"; my @tl = ; close(T); #create big array of data points with added d2i my @big; foreach (@dl,@tl) { chomp($_); if (/^\/\d\d\d\d\d\d\//) { my @n = split(/\//); push @big,[$n[1],$n[2],$n[5],d2i($n[1]),d2i$n[2]]; } } #break by day if needed my @ex = map { my $s = $_->[3]; my $e = $_->[4]; my @out; while (int($s/1440) != int($e/1440)) { my $newe = ( int($s/1440) + 1) * 1440 - 1; push @out, [i2d($s),i2d($newe),$_->[2],$s,$newe]; $s = $newe + 1; } (@out, [i2d($s),$_->[1],$_->[2],$s,$e]); } @big; #build parallel arrays of minute and values ... total minimized for overlaps my (@tally, @id); for my $e (0 .. $#ex) { my $r = $ex[$e]; for my $i ($r->[3] .. $r->[4] ) { if( !defined($tally[$i]) or $tally[$i] > $r->[2] ) { $tally[$i] = $r->[2]; $id[$i] = $e; } } } #recreate [DDHHMM,DDHHMM,V] with overarching tally and ids my @res; my $i = 0; while ($i < $#id) { ++$i until defined $id[$i]; my $id = $id[$i]; my $start = $i; ++$i while defined ($id[$i]) and $id[$i] == $id; my $end = $i - 1; push @res, [i2d($start),i2d($end),$tally[$start]]; } #output organized final to file open (C,'>CDA.txt'); my @last = ("","",""); print C "To do later: ... this still needs specific formatting work(easy)\n"; foreach (@res) { if (substr($last[0],0,2) ne substr(@$_[0],0,2)) { print C "\n"; } print C "@$_[0] @$_[1] @$_[2]\n"; $last[0] = @$_[0]; } close(C); #[temporary] report comparison for manual check @big = sort {$a->[0] <=> $b->[0]} (@big); foreach (@big) { print "@$_[0] @$_[1] @$_[2]\n"; } print "\n"; foreach (@res) { print "@$_[0] @$_[1] @$_[2]\n"; }