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;
}
}