All pastes #987565 Raw Edit

Anonymous

public text v1 · immutable
·published 2008-04-16 16:50 UTC
rendered paste body
#!/usr/bin/perl -w

use strict;
use Time::Local 'timelocal_nocheck';

# Config.
my @special_nr = (
        {
                'name' => 'landlina',
                'regex' => '^(?:5|4)\d{6}$',
                'cap' => 'LANDL<CD>NA'
        },
        {
                'name' => 'gsm',
                'regex' => '^(?:6\d|8[1-9])\d{5}$',
                'cap' => 'GSM'
        },
        {
                'name' => '800',
                'regex' => '^800\d{4}$',
                'cap' => '800'
        },
        {
                'name' => '118',
                'regex' => '^118$',
                'cap' => '118'
        },
        {
                'name' => 'utlond',
                'regex' => '^00\d+$', # Currently not used.
                'cap' => '<DA>TL<D6>ND'
        }
);

# /Config.

# Maybe there's a better sentence than "special days".
if (scalar(@ARGV) != 2) {
        print "Usage: ./processing.pl file_to_process special_days_file\n";
        exit();
}

my @records = ();
if (scalar(@ARGV) && -f $ARGV[0] && -f $ARGV[1]) {
        open(FILE, "<$ARGV[0]");

        # Loop through the file, one line at a time.
        while (my $line = <FILE>) {
                # Make an array of all the elements.
                my @elements = split(/\;/, $line);
                # Delete all " signs from the elements.
                for (my $i = 0; $i < scalar(@elements); $i++) {
                        $elements[$i] =~ s/\"//g;
                }

                # Set the index to the start element of the from and to numbers.
                my %index = ('from' => 17, 'to' => 22);
                # Let's extend the index if the line has an extra column.
                $index{'from'}++ && $index{'to'}++ if ($elements[1] eq "");

                $elements[$index{'from'}] =~ s/F//ig;
                $elements[$index{'from'} + 1] =~ s/F//ig;
                $elements[$index{'to'}] =~ s/F//ig;
                $elements[$index{'to'} + 1] =~ s/F//ig;
                
                my %numbers = ();
                $numbers{'from'} = process_nt($elements[$index{'from'}])->{'number'};
                $numbers{'from'} .= process_nt($elements[$index{'from'} + 1])->{'number'};
                $numbers{'to'} = process_nt($elements[$index{'to'}]);
                # I know this is ugly.
                my $is_local = $numbers{'to'}->{'is_local'};
                $numbers{'to'} = $numbers{'to'}->{'number'};
                $numbers{'to'} .= process_nt($elements[$index{'to'} + 1])->{'number'};

                my $from_hive = 0;
                $from_hive = 1 if ($numbers{'from'} =~ /^354/);

                my $answered = 0;
                $answered = 1 if ($elements[$index{'from'} - 5] == 0);

                my $date = $elements[$index{'from'} - 8];

                my %time = ();
                $time{'elapsed'} = process_nt($elements[$index{'to'} + 3])->{'number'};
                if (defined($time{'elapsed'}) && $time{'elapsed'} ne '' && $time{'elapsed'} >= 0) {
                        $time{'elapsed'} += 5;
                        $time{'elapsed'} =~ s/\d$//g;
                }
                my $peak = process_peak($elements[$index{'to'} + 2], $elements[$index{'from'} - 8], $ARGV[1]);

                push(@records, {'from_number' => $numbers{'from'}, 'to_number' => $numbers{'to'}, 'from_hive' => $from_hive, 'answered' => $answered, 'time_elapsed' => $time{'elapsed'}, 'time_connect' => $time{'connect'}, 'is_local' => $is_local, 'peak' => $peak});
        }
        close(FILE);

        my $all = process_average('all', \@records);
        my $average = process_average('special', \@records);

        print "HEILDARFJ<D6>LDI\n";
        print "S<ED>mt<F6>l: $all->{'time_elapsed'}->{'count'}\n";
        print "Heildarlengd s<ED>mtala: $all->{'time_elapsed'}->{'all'} sec - " . sprintf("%.1f", $all->{'time_elapsed'}->{'all'} / 60) . " min\n";
        print "Me<F0>allengd s<ED>mtala: " . sprintf("%.1f", $all->{'time_elapsed'}->{'average'}) . " sec - " . sprintf("%.1f", $all->{'time_elapsed'}->{'average'} / 60) . " min\n";
        print "Svara<F0>:\n";
        print "\tFj<F6>ldi: $all->{'time_elapsed'}->{'answered'}\n";
        print "\tPr<F3>senta: $all->{'time_elapsed'}->{'answered_average'}%\n";
        print "S<ED>mt<F6>l <E1> <E1>lagst<ED>ma:\n";
        print "\tFj<F6>ldi: $all->{'time_elapsed'}->{'peak'}\n";
        print "\tPr<F3>senta: $all->{'time_elapsed'}->{'peak_average'}%\n";
        print "S<ED>mt<F6>l fr<E1> kerfi Hive:\n";
        print "\tFj<F6>ldi: $all->{'time_elapsed'}->{'from_hive'}\n";
        print "\tPr<F3>senta: $all->{'time_elapsed'}->{'from_hive_average'}%\n";
        print "Fj<F6>ldi s<ED>mtala innanlands: $all->{'time_elapsed'}->{'is_local'}\n";
        print "Fj<F6>ldi s<ED>mtala til <FA>tlanda: $all->{'time_elapsed'}->{'is_foreign'}\n\n";
        foreach (@special_nr) {
                print "$_->{'cap'}\n";
                print "S<ED>mt<F6>l: $average->{$_->{'name'}}->{'count'}\n";
                print "Heildarlengd s<ED>mtala: $average->{$_->{'name'}}->{'all'} sec - " . sprintf("%.1f", $average->{$_->{'name'}}->{'all'} / 60) . " min\n";
                print "Me<F0>alleng s<ED>mtala: " . sprintf("%.1f", $average->{$_->{'name'}}->{'average'}) . " sec - " . sprintf("%.1f", $average->{$_->{'name'}}->{'average'} / 60) . " min\n";
                print "Svara<F0>:\n";
                print "\tFj<F6>ldi: $average->{$_->{'name'}}->{'answered'}\n";
                print "\tPr<F3>senta: $average->{$_->{'name'}}->{'answered_average'}%\n";
                print "S<ED>mt<F6>l <E1> <E1>lagst<ED>ma:\n";
                print "\tFj<F6>ldi: $average->{$_->{'name'}}->{'peak'}\n";
                print "\tPr<F3>senta: $average->{$_->{'name'}}->{'peak_average'}%\n";
                print "S<ED>mt<F6>l fr<E1> kerfi Hive:\n";
                print "\tFj<F6>ldi: $average->{$_->{'name'}}->{'from_hive'}\n";
                print "\tPr<F3>senta: $average->{$_->{'name'}}->{'from_hive_average'}%\n";
                print "Fj<F6>ldi s<ED>mtala innanlands: $average->{$_->{'name'}}->{'is_local'}\n";
                print "Fj<F6>ldi s<ED>mtala til <FA>tlanda: $average->{$_->{'name'}}->{'is_foreign'}\n\n";
        }
} else {
        print "File does not exist.\n";
        exit();
}

sub process_peak {
        my ($time, $date, $sfile) = @_;
        
        my $peak = 0;
        if ($time && $date && $sfile) {
                my ($year, $month, $day) = $date =~ /^(\d)(\d{2})(\d{2})$/;
                $date = 200 . $year . $month . $day;
                
                open(SFILE, "<$sfile");
                my @sdays = <SFILE>;
                foreach (@sdays) {
                        $_ =~ s/\s//g;
                        $peak = 1 if ($date eq $_);
                }
                close(SFILE);

                $time =~ s/\d{3}$//g;
                my ($hour) = $time =~ /^(\d{2})/;
                $peak = 1 if ($hour >= 8 && $hour < 19);

                my $timestamp = timelocal_nocheck(0, 0, 0, $day, $month - 1, $year);
                my @datetime = localtime($timestamp);
                $peak = 1 if ($datetime[6] == 0 || $datetime[6] == 6);
        }

        return $peak;
}

sub process_nt {
        my ($element) = @_;

        my $is_local = 0;
        $is_local = 1 if ($element =~ /^(?:0{4}|0{7,8})[1-9]+/);

        my $number = '';
        my @cut = $element =~ /^0*([1-9])(\d*)$/g;
        if (scalar(@cut) == 2 && defined($cut[0]) && $cut[1]) {
                $number = $cut[0] . $cut[1];
        } elsif (scalar(@cut) == 1 && defined($cut[0])) {
                $number = $cut[0];
        }

        return {'number' => $number, 'is_local' => $is_local};
}

sub process_average {
        my ($type, $records) = @_;

        if ($type && $records && ref($records) eq 'ARRAY' && scalar(@$records)) {
                my %average = ();
                if ($type eq 'all') {
                        %average = ('time_elapsed' => {'average' => 0, 'all' => 0, 'count' => 0, 'answered' => 0, 'answered_average' => 0, 'is_local' => 0, 'is_foreign' => 0, 'peak' => 0, 'peak_average' => 0, 'from_hive' => 0, 'from_hive_average' => 0});
                        my %average_time = ('time_elapsed' => {'all' => 0, 'count' => 0, 'is_local' => 0, 'is_foreign' => 0, 'peak' => 0, 'from_hive' => 0});
                        foreach (@$records) {
                                $average_time{'time_elapsed'}->{'count'}++;
                                $average_time{'time_elapsed'}->{'is_local'}++ if ($_->{'is_local'});
                                $average_time{'time_elapsed'}->{'is_foreign'}++ if (!$_->{'is_local'});
                                $average_time{'time_elapsed'}->{'answered'}++ if ($_->{'answered'});
                                $average_time{'time_elapsed'}->{'peak'}++ if ($_->{'peak'});
                                $average_time{'time_elapsed'}->{'from_hive'}++ if ($_->{'from_hive'});

                                if (defined($_->{'time_elapsed'}) && $_->{'time_elapsed'} ne '' && $_->{'time_elapsed'} >= 0) {
                                        $average_time{'time_elapsed'}->{'all'} += $_->{'time_elapsed'};
                                }
                        }
                        $average{'time_elapsed'}->{'all'} = $average_time{'time_elapsed'}->{'all'};
                        $average{'time_elapsed'}->{'count'} = $average_time{'time_elapsed'}->{'count'};
                        $average{'time_elapsed'}->{'answered'} = $average_time{'time_elapsed'}->{'answered'};
                        $average{'time_elapsed'}->{'is_local'} = $average_time{'time_elapsed'}->{'is_local'};
                        $average{'time_elapsed'}->{'is_foreign'} = $average_time{'time_elapsed'}->{'is_foreign'};
                        $average{'time_elapsed'}->{'peak'} = $average_time{'time_elapsed'}->{'peak'};
                        $average{'time_elapsed'}->{'from_hive'} = $average_time{'time_elapsed'}->{'from_hive'};
                        if ($average_time{'time_elapsed'}->{'count'} > 0) {
                                $average{'time_elapsed'}->{'average'} = $average_time{'time_elapsed'}->{'all'} / $average_time{'time_elapsed'}->{'count'};
                                $average{'time_elapsed'}->{'average'} = sprintf("%.1f", $average{'time_elapsed'}->{'average'});
                                $average{'time_elapsed'}->{'answered_average'} = $average_time{'time_elapsed'}->{'answered'} / $average_time{'time_elapsed'}->{'count'};
                                $average{'time_elapsed'}->{'answered_average'} = sprintf("%.3f", $average{'time_elapsed'}->{'answered_average'});
                                $average{'time_elapsed'}->{'answered_average'} *= 100;
                                $average{'time_elapsed'}->{'peak_average'} = $average_time{'time_elapsed'}->{'peak'} / $average_time{'time_elapsed'}->{'count'};
                                $average{'time_elapsed'}->{'peak_average'} = sprintf("%.3f", $average{'time_elapsed'}->{'peak_average'});
                                $average{'time_elapsed'}->{'peak_average'} *= 100;
                                $average{'time_elapsed'}->{'from_hive_average'} = $average_time{'time_elapsed'}->{'from_hive'} / $average_time{'time_elapsed'}->{'count'};
                                $average{'time_elapsed'}->{'from_hive_average'} = sprintf("%.3f", $average{'time_elapsed'}->{'from_hive_average'});
                                $average{'time_elapsed'}->{'from_hive_average'} *= 100;
                        }
                } elsif ($type eq 'special') {
                        %average = ();
                        foreach (@special_nr) {
                                $average{$_->{'name'}} = {'average' => 0, 'all' => 0, 'count' => 0, 'answered' => 0, 'answered_average' => 0, 'is_local' => 0, 'is_foreign' => 0, 'peak' => 0, 'peak_average' => 0, 'from_hive' => 0, 'from_hive_average' => 0};
                        }

                        foreach (@$records) {
                                foreach my $nr (@special_nr) {
                                        if (ref($_) eq 'HASH' && %$_ && ($_->{'to_number'} =~ /$nr->{'regex'}/ig || ($nr->{'name'} eq 'utlond' && !$_->{'is_local'}))) {
                                                $average{$nr->{'name'}}->{'count'}++;
                                                if (defined($_->{'time_elapsed'}) && $_->{'time_elapsed'} ne '' && $_->{'time_elapsed'} > 0) {
                                                        $average{$nr->{'name'}}->{'all'} += $_->{'time_elapsed'};
                                                        $average{$nr->{'name'}}->{'answered'}++ if ($_->{'answered'});
                                                        $average{$nr->{'name'}}->{'is_local'}++ if ($_->{'is_local'});
                                                        $average{$nr->{'name'}}->{'is_foreign'}++ if (!$_->{'is_local'});
                                                        $average{$nr->{'name'}}->{'peak'}++ if ($_->{'peak'});
                                                        $average{$nr->{'name'}}->{'from_hive'}++ if ($_->{'from_hive'});
                                                }
                                        }
                                }
                        }
                        foreach (@special_nr) {
                                if (ref($average{$_->{'name'}}) eq 'HASH' && $average{$_->{'name'}}->{'count'} > 0) {
                                        $average{$_->{'name'}}->{'average'} = $average{$_->{'name'}}->{'all'} / $average{$_->{'name'}}->{'count'};
                                        $average{$_->{'name'}}->{'average'} =~ sprintf("%.1f", $average{$_->{'name'}}->{'average'});
                                        $average{$_->{'name'}}->{'answered_average'} = $average{$_->{'name'}}->{'answered'} / $average{$_->{'name'}}->{'count'};
                                        $average{$_->{'name'}}->{'answered_average'} = sprintf("%.3f", $average{$_->{'name'}}->{'answered_average'});
ime_elapsed'} > 0) {
                                                        $average{$nr->{'name'}}->{'all'} += $_->{'time_elapsed'};
                                                        $average{$nr->{'name'}}->{'answered'}++ if ($_->{'answered'});
                                                        $average{$nr->{'name'}}->{'is_local'}++ if ($_->{'is_local'});
                                                        $average{$nr->{'name'}}->{'is_foreign'}++ if (!$_->{'is_local'});
                                                        $average{$nr->{'name'}}->{'peak'}++ if ($_->{'peak'});
                                                        $average{$nr->{'name'}}->{'from_hive'}++ if ($_->{'from_hive'});
                                                }
                                        }
                                }
                        }
                        foreach (@special_nr) {
                                if (ref($average{$_->{'name'}}) eq 'HASH' && $average{$_->{'name'}}->{'count'} > 0) {
                                        $average{$_->{'name'}}->{'average'} = $average{$_->{'name'}}->{'all'} / $average{$_->{'name'}}->{'count'};
                                        $average{$_->{'name'}}->{'average'} =~ sprintf("%.1f", $average{$_->{'name'}}->{'average'});
                                        $average{$_->{'name'}}->{'answered_average'} = $average{$_->{'name'}}->{'answered'} / $average{$_->{'name'}}->{'count'};
                                        $average{$_->{'name'}}->{'answered_average'} = sprintf("%.3f", $average{$_->{'name'}}->{'answered_average'});
                                        $average{$_->{'name'}}->{'answered_average'} *= 100;
                                        $average{$_->{'name'}}->{'peak_average'} = $average{$_->{'name'}}->{'peak'} / $average{$_->{'name'}}->{'count'};
                                        $average{$_->{'name'}}->{'peak_average'} = sprintf("%.3f", $average{$_->{'name'}}->{'peak_average'});
                                        $average{$_->{'name'}}->{'peak_average'} *= 100;
                                        $average{$_->{'name'}}->{'from_hive_average'} = $average{$_->{'name'}}->{'from_hive'} / $average{$_->{'name'}}->{'count'};
                                        $average{$_->{'name'}}->{'from_hive_average'} = sprintf("%.3f", $average{$_->{'name'}}->{'from_hive_average'});
                                        $average{$_->{'name'}}->{'from_hive_average'} *= 100;
                                }
                        }
                }

                return \%average;
        }
}