#!/usr/bin/perl -w use strict; use Time::Local 'timelocal_nocheck'; # Config. my @special_nr = ( { 'name' => 'landlina', 'regex' => '^(?:5|4)\d{6}$', 'cap' => 'LANDLNA' }, { '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' => 'TLND' } ); # /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 = ) { # 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 "HEILDARFJLDI\n"; print "Smtl: $all->{'time_elapsed'}->{'count'}\n"; print "Heildarlengd smtala: $all->{'time_elapsed'}->{'all'} sec - " . sprintf("%.1f", $all->{'time_elapsed'}->{'all'} / 60) . " min\n"; print "Meallengd smtala: " . sprintf("%.1f", $all->{'time_elapsed'}->{'average'}) . " sec - " . sprintf("%.1f", $all->{'time_elapsed'}->{'average'} / 60) . " min\n"; print "Svara:\n"; print "\tFjldi: $all->{'time_elapsed'}->{'answered'}\n"; print "\tPrsenta: $all->{'time_elapsed'}->{'answered_average'}%\n"; print "Smtl lagstma:\n"; print "\tFjldi: $all->{'time_elapsed'}->{'peak'}\n"; print "\tPrsenta: $all->{'time_elapsed'}->{'peak_average'}%\n"; print "Smtl fr kerfi Hive:\n"; print "\tFjldi: $all->{'time_elapsed'}->{'from_hive'}\n"; print "\tPrsenta: $all->{'time_elapsed'}->{'from_hive_average'}%\n"; print "Fjldi smtala innanlands: $all->{'time_elapsed'}->{'is_local'}\n"; print "Fjldi smtala til tlanda: $all->{'time_elapsed'}->{'is_foreign'}\n\n"; foreach (@special_nr) { print "$_->{'cap'}\n"; print "Smtl: $average->{$_->{'name'}}->{'count'}\n"; print "Heildarlengd smtala: $average->{$_->{'name'}}->{'all'} sec - " . sprintf("%.1f", $average->{$_->{'name'}}->{'all'} / 60) . " min\n"; print "Mealleng smtala: " . sprintf("%.1f", $average->{$_->{'name'}}->{'average'}) . " sec - " . sprintf("%.1f", $average->{$_->{'name'}}->{'average'} / 60) . " min\n"; print "Svara:\n"; print "\tFjldi: $average->{$_->{'name'}}->{'answered'}\n"; print "\tPrsenta: $average->{$_->{'name'}}->{'answered_average'}%\n"; print "Smtl lagstma:\n"; print "\tFjldi: $average->{$_->{'name'}}->{'peak'}\n"; print "\tPrsenta: $average->{$_->{'name'}}->{'peak_average'}%\n"; print "Smtl fr kerfi Hive:\n"; print "\tFjldi: $average->{$_->{'name'}}->{'from_hive'}\n"; print "\tPrsenta: $average->{$_->{'name'}}->{'from_hive_average'}%\n"; print "Fjldi smtala innanlands: $average->{$_->{'name'}}->{'is_local'}\n"; print "Fjldi smtala til 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 = ; 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; } }