Задача которую мне дали как эникейщику очень интересная, у меня конечно был выбор – делать или нет, но я фанат обработки больших массивов данных и поэтому с радостью взялся за дело в более менее свободные минуты.
Мне дали логи, накопленные за месяц, такого типа:
16/03/10 11:19AM 109 04 <I> 0’00 00:13’22 TR
16/03/10 11:21AM 138 09 35606 00:00’24
16/03/10 11:23AM 138 09 21352 00:01’07
16/03/10 11:24AM 151 06 <I> 0’00 00:08’55 TR
16/03/10 11:27AM 606 07 <I> 1’02 00:00’00 NA
16/03/10 11:29AM 121 09 83439641811 00:00’22
16/03/10 11:31AM 108 08 51687 00:00’05
16/03/10 11:31AM 109 09 33938 00:00’38
16/03/10 11:33AM 108 08 51687 00:01’26
16/03/10 11:34AM 155 09 89226161011 00:00’39
Мучался я мучался в Excel и плюнул в него с расстояния вытянутой руки. Хотя знаю что там можно сделать было. А задача такая: надо посчитать для каждого номера, сколько было потрачено минут на межгород и на каждого сотового оператора в отдельности.
Для чего анализировать логи ? чтобы выяснить, куда совершается больше звонков, ту часть первой и оптимизировать по расходам.
В итоге я сел за Perl, хотя потом пришел к выводу что надо бы по идее в Python все делать пробовать. Исходный код получился ничего себе, может быть кому-нибудь и пригодиться, выкладываю полностью:
#!perl/bin/perl
# из диапазонов сотовых создадим массив diap_array
open (A,’ru_m.txt’); @diap=<A>; close A;
$i=0;
foreach $diap(@diap){
@diap_one=split (/\t/, $diap);
@diap_subnum=split (/-/,$diap_one[3]);
$diap_start =$diap_one[2].$diap_subnum[0];
$diap_end =$diap_one[2].$diap_subnum[1];
$diap_name=$diap_one[0];
$diap_array[$i][0]=$diap_name;
$diap_array[$i][1]=’8′.$diap_start;
$diap_array[$i][2]=’8′.$diap_end;
$i++;
}
print "Сгенерили хэш диапазонов.";
# пример:
#2825 ARRAY(0x19b00dc)
# 0 ‘ЗАО "Мобиком-Кавказ"’
# 1 89974450000
# 2 89974456999# из логов сгенерим
open (A,’1.txt’); @a=<A>; close A;
foreach $b(@a)
{@b=split (/\s+/, $b);
if (length($b[4])>=11 && $b[4]=~/^\d+$/)
{$b[5]=~s/’/:/;
@c=split(/:/,$b[5]);
$c[1]=$c[1]+$c[0]*60+1;
if ($b[4]<89000000000) {$m{$b[2]}{‘Межгород’}=$m{$b[2]}{‘Межгород’}+$c[1];}
else {foreach $k(@diap_array)
{if ($b[4]>=$k->[1] && $b[4]<=$k->[2])
{$m{$b[2]}{$k->[0]}=$m{$b[2]}{$k->[0]}+$c[1];
#print $m{$b[2]}{$k->[0]}."\n";
}
}
}}
}#use Dumpvalue;
#$d=Dumpvalue->new;
#$d->dumpValue(\%m);use Data::Dumper;
print Dumper(\%m);
т.к. пришлось узнавать для каждого исходящего – диапазоны сотовых операторов, поэтому я прикрутил базу этих диапазонов, вида:
Оператор Регион код DEF Диапазон нумерации дата открытия Стандарт
ЗАО "Ростовский Сотовый Телефон" Ростов-на-Дону Ростовская область 901 0000000-0009999 28.04.2006 NMT-450
ОАО "Краснодарская Сотовая Связь" Краснодар Краснодарский край 901 1000000-1009999 01.07.2007 NMT-450
ОАО "Краснодарская Сотовая Связь" Краснодар Краснодарский край 901 1010000-1019999 01.01.1980 NMT-450
ОАО "Краснодарская Сотовая Связь" Краснодар Краснодарский край 901 1030000-1039999 04.07.2008 NMT-450
Базу я взял из одного из своих старых проектов, а туда мы брали вроде как с МТС сайта, но не буду врать. Ее легко думаю можно обновить.
Вот такая бесплатная софтина получилась, чего с ней делать щас – незнаю, это конечный вариант.