forum.bitel.ru
http://forum.bitel.ru/

Помогите с конвертацией логов
http://forum.bitel.ru/viewtopic.php?f=19&t=6588
Страница 1 из 1

Автор:  SeGa [ 22 мар 2012, 06:02 ]
Заголовок сообщения:  Помогите с конвертацией логов

Помогите плиз с конвертацией логов
сейчас имею следующий код:
Код:
#use strict;
use POSIX;

my $exclude;

my $base_path = "/atc";
my $sourcelog_path = "$base_path/csv";
my $destlog_path = "$base_path/source";

process_ats( 1 );

sub process_ats
{
   my $ats_num = shift;
   my $dir_name = $sourcelog_path;
   
   opendir( DIR, $dir_name )
      or die "Can't open dir $dir_name\n";
      
   foreach ( readdir( DIR ) )    
   {
      if( $_ ne "." && $_ ne ".." )
      {
         my $file_name = $dir_name."/".$_;
         print "Processing file $file_name\n";         
         process_file( $file_name, "$destlog_path/" );
      }      
   }
   
   closedir( DIR );   
}


sub process_file
{
   my $src_file = shift;
   my $dst_dir = shift;
   
    open( FILE, $src_file )
       or die "Can't open file $src_file\n";

    my %DATA;

    LINE: while( <FILE> )
    {
   if (/^(\w+)\s(\d+)\s(.*)\s(\d{4})\-(\d{2})\-(\d{2})\s(\d{2}):(\d{2}):(\d{2})\s(\d{4})\-(\d{2})\-(\d{2})\s(\d{2}):(\d{2}):(\d{2})\s(\d+)\s(\w+)\s(\w+)\s(\w+)\s(\w+)\s(\w+)\s(\w+)\s(\d+)\s(\d+)\s(\w+)\s(\w+)\s(\w+)\s(\w+)\s(.*)\s(\w+)\s(\w+)\s(\w+)\s(\w+)\s(\w+)\s(\w+)/)
       {             
          my ( $from_port, $from_num, $to_port, $to_num, $dd, $mm, $yy,  $h, $m, $s, $amount )
          = ( $30, $2, $32, $3, $6, $5, $4, $7, $8, $9, $17 );
         $amount=ceil($amount/10);
          
          $from_num_e164 = num2e164( $from_num );
      $to_num =~ s/\*//g;

          $to_num_e164 = num2e164( $to_num );      

          my $key = $yy."_".$mm."_".$dd."_".$h;
          my $value = "$dd.$mm.$yy $h:$m:$s\t$amount\t$from_num\t$from_num_e164\t$to_num\t$to_num_e164\t$from_port\t$to_port\t0\n";
   
          $DATA{$key} .= $value;
       }
       else
       {
          warn "unrecognized string:\n $_\n";
       }
    }

    close( FILE );
   

    foreach my $key ( keys %DATA )
    {
        my ( $YY, $MM, $DD, $HH ) = split( /_/, $key );
       my $path = $dst_dir.$YY;

       if ( !-e $path )
       {
          mkdir $path, 320;
       }
       
       $path = $path."/".$MM;

       if ( !-e $path )
       {
          mkdir $path, 320;
       }


       my $file = $path."/".$DD."_".$HH;

       open( FILE, ">".$file ) or die "can't create file '$file': $!\n";
       print FILE $DATA{$key};
       close( FILE );

       chdir $path;
       my $err = `zip ${DD}_${HH}.zip ${DD}_${HH}`;
       unlink ( "${DD}_${HH}" );
       chdir $base_path;
    }
   
    close FILE;
}   

sub num2e164
{
   my $num = shift;
   chomp($num);
   
   $before = $num;
   if ( $num=="42324030200" )
       { $num="4232403020"; }
   if( $num =~s/^77(\d{4})(\d+)$/7423677$1/ )
   {
   }
   elsif ( $num =~ s/^79(\d{4})(\d+)$/7423679$1/ )
   {
   }
   elsif ( $num =~ s/^64(\d{4})(\d+)$/7423664$1/ )
   {
   }
   elsif( $num =~ s/^(\d{10})$/7$1/ )
   {
   }
   elsif ( $num =~ s/^5(\d{4})(\d+)$/7423665$1/ )
   {
   }
   elsif ( $num =~ s/^5(\d{4})$/7423665$1/ )
   {
   }
   elsif ( $num =~ s/^66(\d{5})$/742366$1/ )
   {
   }
   elsif ( $num =~ s/^01(\d+)$/7423601/ )
   {
   }
   elsif ( $num =~ s/^02(\d+)$/7423602/ )
   {
   }
   elsif ( $num =~ s/^03(\d+)$/7423603/ )
   {
   }
   elsif( $num =~ s/^(\d{1,7})$/74236$1/ )
   {
   }
   elsif( $num =~ s/^810(\d+)$/$1/ )
   {
   }
   elsif( $num=~ s/^84236(\d+)$/074236$1/ )
   {
   }
   elsif( $num =~ s/^8(\d+)$/7$1/ )
   {
   }
   elsif( $num =~ s/^6(\d{5})(\d+)$/742366$1/ ){
   }
   elsif ( $num =~ s/^7(\d{10})$/7/ )
   {
   }
   elsif ( $num =~ s/^(\d{11,13})$/$1/ )
   {
   }
   elsif( $num =~ s/^(\d+)$/74236$1/ )
   {
   }   
   else
   {
      print "Unknown number type $num\n";
   }
   return $num;
}


Что сделать что бы вот это
Код:
elsif( $num=~ s/^84236(\d+)$/074236$1/ )
   {
   }

выполнялось только если звонок прошел скажем через 1 транк( $to_port=1) ???
Не спрашивайте почему 07...., так надо)

Автор:  KostiK [ 26 мар 2012, 17:26 ]
Заголовок сообщения:  Re: Помогите с конвертацией логов

SeGa писал(а):
выполнялось только если звонок прошел скажем через 1 транк( $to_port=1) ???

Что такое транк?

Автор:  stark [ 26 мар 2012, 18:20 ]
Заголовок сообщения:  Re: Помогите с конвертацией логов

SeGa писал(а):
[/code]
Что сделать что бы вот это
Код:
elsif( $num=~ s/^84236(\d+)$/074236$1/ )
   {
   }

выполнялось только если звонок прошел скажем через 1 транк( $to_port=1) ???
Не спрашивайте почему 07...., так надо)


В смысле вам просто условие port==1 надо добавить и все ?

Код:
elsif( $num=~ s/^84236(\d+)$/074236$1/ && port==1 )
   {
   }

Автор:  skyb [ 27 мар 2012, 09:40 ]
Заголовок сообщения:  Re: Помогите с конвертацией логов

KostiK писал(а):
SeGa писал(а):
выполнялось только если звонок прошел скажем через 1 транк( $to_port=1) ???

Что такое транк?

наверное имелось ввиду транковый порт

Автор:  aardvark [ 04 апр 2012, 16:36 ]
Заголовок сообщения:  Re: Помогите с конвертацией логов

Код:
elsif( ($from_port == 1) and ($num=~ s/^84236(\d+)$/074236$1/))
   {
   }

Это если надо когда получен из 1 транка, меняйте на $to_port для отправляемого транка.
source: http://perldoc.perl.org/5.8.8/perlop.html#Logical-And

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/