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/ |