Кто куда звонит на вашем предприятии ?

15.4.2010 - 1673 просмотрa ;)

 карта

Задача которую мне дали как эникейщику очень интересная, у меня конечно был выбор – делать или нет, но я фанат обработки больших массивов данных и поэтому с радостью взялся за дело в более менее свободные минуты.

 

Мне дали логи, накопленные за месяц, такого типа:

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

Базу я взял из одного из своих старых проектов, а туда мы брали вроде как с МТС сайта, но не буду врать. Ее легко думаю можно обновить.

Вот такая бесплатная софтина получилась, чего с ней делать щас – незнаю, это конечный вариант.

Статьи из раздела, Видеочат рулетка