- 浏览: 82897 次
- 性别:
- 来自: 南京
文章分类
最新评论
perl 学习
[SYSTEM1]
#config the country No.
COUNTRY_CODE= 7
#config the MMSCID of the MMSC Server
MMSC_ID= MMS
#config the host name of the MMSC Server
HOST_NAME = HUAWEI
#config the dir of logs
LOG_PATH= $HOME/mms_home/cdr/changeBill/log
#config the source bill file's path.
SRC_CDR_PATH = $HOME/mms_home/cdr/bill/send
#config the bill change tmp dir
CHANGE_TMP_DIR=$HOME/mms_home/cdr/changeBill/buffer
#config the map of areacode and areadir ,for each area
AREA_DIR_ITEM= 11000000,$HOME/mms_home/cdr/changeBill/Moscow
AREA_DIR_ITEM= 12000000,$HOME/mms_home/cdr/changeBill/Volga
AREA_DIR_ITEM= 13000000,$HOME/mms_home/cdr/changeBill/Center
AREA_DIR_ITEM= 14000000,$HOME/mms_home/cdr/changeBill/NorthWest
AREA_DIR_ITEM= 15000000,$HOME/mms_home/cdr/changeBill/South
AREA_DIR_ITEM= 16000000,$HOME/mms_home/cdr/changeBill/Ural
AREA_DIR_ITEM= 17000000,$HOME/mms_home/cdr/changeBill/Siberia
AREA_DIR_ITEM= 18000000,$HOME/mms_home/cdr/changeBill/FarEast
#config the dosen't matched areacode and dir.
#in this config item,the code must be configed "10000000"
AREA_DIR_ITEM=10000000,$HOME/mms_home/cdr/changeBill/Notmatch
#AREA_DIR_ITEM=10000000,$HOME/mms_home/cdr/changeBill/ITC
CHANGE_BAK_DIR = $HOME/mms_home/cdr/changeBill/ITC
#the config files dir
CONFIG_FILES_DIR=$HOME/mms_home/cdr/changeBill/.cfg
while ($current_count < @records)
{
#获取其中一条计费话单
my @arr_cdr_field = split (/\,/, $records[$current_count]);
#如果原始话单记录,区域码为空时.
if ("" eq $arr_cdr_field[23])
{
$arr_cdr_field[23]=10000000;
}
#如果区域码配置有误.
my $macth=0;
foreach $areacode (keys %area_dir_map)
{
if ($areacode eq $arr_cdr_field[23])
{
$macth++;
}
}
if (!$macth)
{
$arr_cdr_field[23]=10000000;
#区域码配置有误时,做日志
if ($log_times==0)
{
#printlog "some area codes in config file :$INIFile is configed error !";
#printlog "the bill records of those areas ,are stored into the default dir : $area_dir_map{10000000}!";
$log_times++;
}
}
#根据原始话单记录的第24位(区域码),进行匹配. 将转换后的话单,写到匹配上的区域目录下的临时文件.
foreach $areacode (keys %area_dir_map)
{
#获得话单记录中区域号 ,根据区域号不同将记录写道不同话单目录.
#if ($areacode eq $arr_cdr_field[$#arr_cdr_field-1])
if ($areacode == $arr_cdr_field[23])
{
#定义转换后话单的第1个字段 Rec_Type .
$rec_type="52";
if ($arr_cdr_field[7] <= 2 )
{
$rec_type="51";
}
elsif ($flag==1)
{
#五位二进制,就一位为一时.
if (1==$tmp_28_w[0])
{
$type_1_ser="1"
}
if (1==$tmp_28_w[1])
{
$type_1_ser="2"
}
if (1==$tmp_28_w[2])
{
$type_1_ser="4"
}
if (1==$tmp_28_w[3])
{
$type_1_ser="8"
}
if (1==$tmp_28_w[4])
{
$type_1_ser="16"
}
}
return $type_1_ser;
}
#用来做话单分拣的方法.
sub read_bill_record
{
#MMSC-ID+日期+序列号
#获取话单目录的所有话单文件
#
if(!opendir(handledir,$src_cdr_path))
{
printlog "$src_cdr_path not exist!";
return -1;
}
#
printlog "begin processing cdr file in directory:$src_cdr_path!";
#读取每一个文件
my $file_index = 0;
my @arr_record;
my $record_index = 0;
my (%arr_cdr_field, $Item);
my $dest_cdr_file_name = "";
my $src_cdr_file = "";
my $log_times=0;
while (defined($src_cdr_file = readdir(handledir)))
{
#获取每一个话单文件,并且进行读取
if (("." eq $src_cdr_file) || (".." eq $src_cdr_file) || ($src_cdr_file !~/^[0-9]{8,}.[0-9]{4}$/ ))
{
next;
}
#
$cdr_file = "$src_cdr_path/$src_cdr_file";
#清空数组
@records=();
if(open(fCdrHandle, "$cdr_file"))
{
#如果文件正常打开,
#现在每个目录下面 打开几个临时文件
foreach $areacode (keys %area_dir_map)
{
$dest_cdr_file_name = "$change_tmp_dir/$tmp_child_dirs{$areacode}/" . "." . "$src_cdr_file.tmp";
open($areacode,">>$dest_cdr_file_name");
}
#打开临时备份文件
#生成保存mmsid number 的文件
my $bak_dir_tmp = &bak_dir_tmp();
$bak_tmp_file = "$bak_dir_tmp/" . "." ."$src_cdr_file.tmp";
open(BAK_TMP_FILE,">>$bak_tmp_file");
#读整个文件
@records=<fCdrHandle>;
my $current_count=0;
# 将十进制转换为64进制的方法
$arr="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/";
sub ch_num_to_64(){
#参数
my @list_data=();
my $res_data;
my $res =$_[0];
if (int($res)==0){
$res_data=0;
}
my $res2;
while($res != 0)
{
$res2 = $res%64;
push(@list_data,substr($arr,$res2,1));
$res = int($res/64);
}
@list_data=reverse (@list_data);
foreach $item (@list_data){
$res_data.=$item;
}
return $res_data;
}
#转换后的话单序列号
#$arr_cdr_field[0]=$_[0] 原始话单的序列号
#1116160948004901012071000
sub changebill_sequence_no_new_no2()
{
#time
#从原始话单序列号中获得HHMM的时间.
my $param_0=$_[0];
my $test_time=substr($param_0,4,4);
#sequence_no
my $sequence_no=substr($param_0,$len-9,5);
my $mod_id=substr($sequence_no,1,1);
my $manager_id =substr($sequence_no,2,1);
my $seq_id=substr($sequence_no,3,2);
#water_id
my $water_id=substr($param_0,$len-2,2);
my $rest=$test_time.$mod_id.$manager_id.$seq_id.$water_id;
return $rest;
}
#获取新话单第16个字段
#定义话单的第16个字段 Type_1_Ser
#获取原始话单第28个字段的值.
#传参$_[0]= $arr_cdr_field[27]
sub changebilltype_1_ser_new_no16()
{
$tmp_28_data=$_[0];
$tmp_28_w[0]=substr($tmp_28_data,0,1);
$tmp_28_w[1]=substr($tmp_28_data,1,1);
$tmp_28_w[2]=substr($tmp_28_data,2,1);
$tmp_28_w[3]=substr($tmp_28_data,3,1);
$tmp_28_w[4]=substr($tmp_28_data,4,1);
my $flag=0;
foreach $tmp_item (@tmp_28_w)
{
if (1==$tmp_item)
{
$flag +=1;
}
}
if ($flag > 1)
{
#五位二进制有多位为1.
#新话单16位填16.
$type_1_ser="16";
}
elsif ($flag==0)
{
#五位二进制都为0
#暂且填"16"
$type_1_ser="16";
}
#生成保存mmsid number的文件
sub create_curr_num_file
{
#生成保存mmsid number 的文件
$curr_num_file="$config_files_dir/.current_num.cfg";
if(! -e "$curr_num_file")
{
`touch $curr_num_file`;
}
}
#初始化目录及文件
sub init_dirs_and_files
{
#初始化目录
&mark_areadir_and_tmpdir();
#初始化文件
&create_curr_num_file();
}
#将16进制ip地址,转换为10进制
sub trans_ip
{
my $src = $_[0];
my $des = "";
my $size = length($src);
if ($size !=
{
return $des;
}
$_ = $src;
if (/[\dA-Fa-f]{8}/)
{
my $tmp;
$tmp=hex (substr($src,0,2));
$des=$tmp;
$tmp=hex (substr($src,2,2));
$des=$des . "." . "$tmp";
$tmp=hex (substr($src,4,2));
$des=$des . "." . "$tmp";
$tmp=hex (substr($src,6,2));
$des=$des . "." . "$tmp";
}
return $des;
}
sub trans_hex
{
my $src = $_[0];
my $des = "";
my $size = length($src);
if ($size == 0)
{
return $des;
}
$_ = $src;
if (/^[\dA-Fa-f]+$/)
{
$des = hex($src);
}
return $des;
}
#需要备份文件
my $log_exist =1 if -e $LOGFile;
if ($log_exist == 1)
{
#判断一下当前的文件大小,如果大于10M,那么更换一个新文件
#my $timestamp = gmtime;
my $log_bak = 0;
$log_bak = 1 if -s $LOGFile >= 20480000;
#需要备份文件
if ($log_bak == 1)
{
#日志备份
#my $timestamp = gmtime;
#my $new_file_name = "decompose.log." . "$timestamp";
#rename "decompose.log", "$new_file_name";
#日志回滚
if ($open_log==1)
{
close LOG;
}
unlink "$LOGFile";
}
}
#处理分拣异常
sub error_bill_press
{
#打开原始话单目录
opendir SOR_PATH , $src_cdr_path;
foreach $areacode (keys %area_dir_map)
{
#打开各个区域的分拣目录
opendir $areacode , "$change_tmp_dir/$tmp_child_dirs{$areacode}";
foreach $area_tmp_file (readdir $areacode)
{
my $count_p=0;
#排除. 或..的文件
if (("." eq $area_tmp_file) || (".." eq $area_tmp_file))
{
next;
}
#如果区域的分拣目录中含有.tmp的文件.
if ($area_tmp_file =~ /^.[0-9]{8,}.[0-9]{4}.tmp$/)
{
$src_cdr_file=substr($area_tmp_file,1,length($area_tmp_file)-5);
#chomp($src_cdr_file); 文件名字不可有换行符,注释掉该行
foreach $src_cdr_f (readdir SOR_PATH)
{
#排除. 或..的文件
if (("." eq $src_cdr_f) || (".." eq $src_cdr_f)||($src_cdr_f!~/[0-9]{8,}.[0-9]{4}$/) )
{
next;
}
#chomp($src_cdr_f); 文件名字不可有换行符,注释掉该行
if($src_cdr_f eq $src_cdr_file)
{
$count_p++;
last;
}
}
if (/AREA_DIR_ITEM/)
{
my @arr=split(/=/,$_);
my @area_dir_item=split(",",$arr[1]);
#转换配置文件中的$HOME变量
$area_dir_item[1]=`echo $area_dir_item[1]`;
#去掉空格及换行符.
$area_dir_item[0]=~s/^\s*|\s*$//g;
$area_dir_item[1]=~s/^\s*|\s*$//g;
push @area_dir_map ,($area_dir_item[0],$area_dir_item[1]);
#获得tmp下面的文件夹名
my @arr_dirs=split(/\//,$area_dir_item[1]);
push @tmp_child_dirs , ($area_dir_item[0],$arr_dirs[@arr_dirs-1]);
}
$Item = 1;
}
$Item = 0;
%area_dir_map=@area_dir_map;
%tmp_child_dirs=@tmp_child_dirs;
close CONFIG;
}
}
#读配置文件
read_decompose_ini();
#定义log文件
$LOGFile = "$log_path/decompose.log";
#标识log打开
$open_log=0;
#打开log
if (! -d $log_path)
{
system("mkdir -p $log_path");
}
if (open LOG,">>$LOGFile")
{
$open_log=1;
}
#输入一个参数,参数值为打印字符串
sub printlog
{
#日志正常打开
if ($open_log == 1)
{
my $date = `date +'%Y%m%d%H%M%S'`;
chomp($date);
my $string = "[" . "$date". "]" . "[" . "$$" . "][" . "$_[0]" . "]";
print LOG "$string\n";
}
}
#config the country No.
COUNTRY_CODE= 7
#config the MMSCID of the MMSC Server
MMSC_ID= MMS
#config the host name of the MMSC Server
HOST_NAME = HUAWEI
#config the dir of logs
LOG_PATH= $HOME/mms_home/cdr/changeBill/log
#config the source bill file's path.
SRC_CDR_PATH = $HOME/mms_home/cdr/bill/send
#config the bill change tmp dir
CHANGE_TMP_DIR=$HOME/mms_home/cdr/changeBill/buffer
#config the map of areacode and areadir ,for each area
AREA_DIR_ITEM= 11000000,$HOME/mms_home/cdr/changeBill/Moscow
AREA_DIR_ITEM= 12000000,$HOME/mms_home/cdr/changeBill/Volga
AREA_DIR_ITEM= 13000000,$HOME/mms_home/cdr/changeBill/Center
AREA_DIR_ITEM= 14000000,$HOME/mms_home/cdr/changeBill/NorthWest
AREA_DIR_ITEM= 15000000,$HOME/mms_home/cdr/changeBill/South
AREA_DIR_ITEM= 16000000,$HOME/mms_home/cdr/changeBill/Ural
AREA_DIR_ITEM= 17000000,$HOME/mms_home/cdr/changeBill/Siberia
AREA_DIR_ITEM= 18000000,$HOME/mms_home/cdr/changeBill/FarEast
#config the dosen't matched areacode and dir.
#in this config item,the code must be configed "10000000"
AREA_DIR_ITEM=10000000,$HOME/mms_home/cdr/changeBill/Notmatch
#AREA_DIR_ITEM=10000000,$HOME/mms_home/cdr/changeBill/ITC
CHANGE_BAK_DIR = $HOME/mms_home/cdr/changeBill/ITC
#the config files dir
CONFIG_FILES_DIR=$HOME/mms_home/cdr/changeBill/.cfg
评论
14 楼
luogen33
2012-05-11
printlog "finish processing $src_cdr_file";
#删除掉这个刚出完的文件
unlink "$cdr_file";
#对生成的新话单,重新命名.
my $date_tmp = `date +'%H%M%S'`;
#去换行符
chomp($date_tmp);
#重命名临时转换文件,为定制话单名
$new_file_name= $mmsc_id."-". $host_name . "-". substr($src_cdr_file,-13,-5) ."$date_tmp" . "-" . substr($src_cdr_file,-4);
foreach $areacode (keys %area_dir_map)
{
#将文件移动到目标目录
copy "$change_tmp_dir/$tmp_child_dirs{$areacode}/". "." . "$src_cdr_file.tmp" ,"$area_dir_map{$areacode}/$new_file_name";
#删除临时转换目录下的文件
unlink "$change_tmp_dir/$tmp_child_dirs{$areacode}/". "." . "$src_cdr_file.tmp";
}
#重命名备份文件
copy "$bak_tmp_file" , "$change_bak_dir/$new_file_name";
unlink "$bak_tmp_file";
}
else
{
printlog "open cdr file:$cdr_file failed!";
}
}
# 关闭原始目录的io流
closedir(handledir);
printlog "Finish processing cdr file in directory:$src_cdr_path!";
return 0;
}
init_dirs_and_files();
before_start();
read_bill_record();
#如果打开了日志文件,那么退出前关闭文件
if ($open_log == 1)
{
close LOG;
}
#删除掉这个刚出完的文件
unlink "$cdr_file";
#对生成的新话单,重新命名.
my $date_tmp = `date +'%H%M%S'`;
#去换行符
chomp($date_tmp);
#重命名临时转换文件,为定制话单名
$new_file_name= $mmsc_id."-". $host_name . "-". substr($src_cdr_file,-13,-5) ."$date_tmp" . "-" . substr($src_cdr_file,-4);
foreach $areacode (keys %area_dir_map)
{
#将文件移动到目标目录
copy "$change_tmp_dir/$tmp_child_dirs{$areacode}/". "." . "$src_cdr_file.tmp" ,"$area_dir_map{$areacode}/$new_file_name";
#删除临时转换目录下的文件
unlink "$change_tmp_dir/$tmp_child_dirs{$areacode}/". "." . "$src_cdr_file.tmp";
}
#重命名备份文件
copy "$bak_tmp_file" , "$change_bak_dir/$new_file_name";
unlink "$bak_tmp_file";
}
else
{
printlog "open cdr file:$cdr_file failed!";
}
}
# 关闭原始目录的io流
closedir(handledir);
printlog "Finish processing cdr file in directory:$src_cdr_path!";
return 0;
}
init_dirs_and_files();
before_start();
read_bill_record();
#如果打开了日志文件,那么退出前关闭文件
if ($open_log == 1)
{
close LOG;
}
13 楼
luogen33
2012-05-11
#P2E 不要52
if("52" eq $rec_type && $arr_cdr_field[5]=~/@/)
{
next;
}
#E2P不要51
if ("51" eq $rec_type && $arr_cdr_field[4]=~/@/)
{
next;
}
#过期或转LSS 时,不出52话单
if ("3" eq $success && "52" eq $rec_type)
{
next;
}
if ( "4" eq $success && "52" eq $rec_type)
{
next;
}
printf $areacode "$record";
}
}
#以写读的方式写话单文件,话单文件不存在就创建新的文件
@arr_cdr_field = ();
++$current_count;
}
#当每一个原话单文件读完时,关闭流
close(fCdrHandle);
#关闭写文件的流
foreach $areacode (keys %area_dir_map)
{
close ($areacode);
}
#关闭临时备份文件
close BAK_TMP_FILE;
#记录当前mmsid number
&writeCurr_num();
if("52" eq $rec_type && $arr_cdr_field[5]=~/@/)
{
next;
}
#E2P不要51
if ("51" eq $rec_type && $arr_cdr_field[4]=~/@/)
{
next;
}
#过期或转LSS 时,不出52话单
if ("3" eq $success && "52" eq $rec_type)
{
next;
}
if ( "4" eq $success && "52" eq $rec_type)
{
next;
}
printf $areacode "$record";
}
}
#以写读的方式写话单文件,话单文件不存在就创建新的文件
@arr_cdr_field = ();
++$current_count;
}
#当每一个原话单文件读完时,关闭流
close(fCdrHandle);
#关闭写文件的流
foreach $areacode (keys %area_dir_map)
{
close ($areacode);
}
#关闭临时备份文件
close BAK_TMP_FILE;
#记录当前mmsid number
&writeCurr_num();
12 楼
luogen33
2012-05-11
#定义转换后话单的第14个字段IMEI
$imei=$arr_cdr_field[36];
#定义话单的第16个字段 Type_1_Ser
#获取原始话单第28个字段的值
#$type_1_ser=&changebilltype_1_ser_new_no16($arr_cdr_field[27]);
$type_1_ser="";
#定义转换后话单的第20个字段A_AREA
$a_area=trans_hex($arr_cdr_field[37]);
#定义转换后话单的第21个字段A_CELL
$a_cell=trans_hex($arr_cdr_field[38]);
#定义转换后话单的第28个字段Tarif Class
$tarif_class=$arr_cdr_field[12];
#定义转换后话单的第30个字段
$call_reference= $arr_cdr_field[34];
#定义转换后话单的第33个字段
$mcc_mnc= $arr_cdr_field[39];
#定义转换后话单的第37个字段
#MODFIY BY LGG DTS2012031205074
$brt_session_id="";
if ( "" ne $sessionID )
{
$brt_session_id= $sessionID.":".$tarif_class."|"."0";
}
#MODFIY BY LGG DTS2012031205074
#定义转换后的话单的第38个字段SGSN
#$msc_id =$arr_cdr_field[35];
$msc_id=&trans_ip($arr_cdr_field[35]);
#定义转换后的第41个字段CDR_UDF
# CDR_UDF 是一个组合字段 ,格式:TC=9999&APP=0
#TC
$tc =$arr_cdr_field[12];
#APP
$app=$arr_cdr_field[21];
if( $arr_cdr_field[9] <=2 )
{
$app="0";
}
$cdr_udf="TC=" . $tc . "&" . "APP=" . $app;
$record=$rec_type . "," . $rec_number . ",,,". $imsi ."," . $msisdn ."," . $dialed . "," . $start_time . "," . $duration . "," . $success . ",".$dd_type.",".$call_type.",,".$imei.",," . $type_1_ser . ",,,,".$a_area.",".$a_cell.",,,,,,," . $tarif_class . ",,".$call_reference.",,,".$mcc_mnc.",,,,".$brt_session_id.",".$msc_id.",,,,". $cdr_udf ."\n" ;
#写临时备份文件
printf BAK_TMP_FILE "$record";
$imei=$arr_cdr_field[36];
#定义话单的第16个字段 Type_1_Ser
#获取原始话单第28个字段的值
#$type_1_ser=&changebilltype_1_ser_new_no16($arr_cdr_field[27]);
$type_1_ser="";
#定义转换后话单的第20个字段A_AREA
$a_area=trans_hex($arr_cdr_field[37]);
#定义转换后话单的第21个字段A_CELL
$a_cell=trans_hex($arr_cdr_field[38]);
#定义转换后话单的第28个字段Tarif Class
$tarif_class=$arr_cdr_field[12];
#定义转换后话单的第30个字段
$call_reference= $arr_cdr_field[34];
#定义转换后话单的第33个字段
$mcc_mnc= $arr_cdr_field[39];
#定义转换后话单的第37个字段
#MODFIY BY LGG DTS2012031205074
$brt_session_id="";
if ( "" ne $sessionID )
{
$brt_session_id= $sessionID.":".$tarif_class."|"."0";
}
#MODFIY BY LGG DTS2012031205074
#定义转换后的话单的第38个字段SGSN
#$msc_id =$arr_cdr_field[35];
$msc_id=&trans_ip($arr_cdr_field[35]);
#定义转换后的第41个字段CDR_UDF
# CDR_UDF 是一个组合字段 ,格式:TC=9999&APP=0
#TC
$tc =$arr_cdr_field[12];
#APP
$app=$arr_cdr_field[21];
if( $arr_cdr_field[9] <=2 )
{
$app="0";
}
$cdr_udf="TC=" . $tc . "&" . "APP=" . $app;
$record=$rec_type . "," . $rec_number . ",,,". $imsi ."," . $msisdn ."," . $dialed . "," . $start_time . "," . $duration . "," . $success . ",".$dd_type.",".$call_type.",,".$imei.",," . $type_1_ser . ",,,,".$a_area.",".$a_cell.",,,,,,," . $tarif_class . ",,".$call_reference.",,,".$mcc_mnc.",,,,".$brt_session_id.",".$msc_id.",,,,". $cdr_udf ."\n" ;
#写临时备份文件
printf BAK_TMP_FILE "$record";
11 楼
luogen33
2012-05-11
#含有“+”号码为手机
if($is_sp_or_email1 != -1)
{
if($country_code_index1!=-1)
{
#去国家吗
$dialed=substr($arr_cdr_field[4],length($country_code));
}else
{
#加“00”
#$dialed="00" . substr($arr_cdr_field[4],1);
$dialed= substr($arr_cdr_field[4],1);
}
}
else
{
$dialed=$arr_cdr_field[4];
}
}
#定义转换后话单的第8个字段Start_Time
$start_time=$arr_cdr_field[24];
if ("52" eq $rec_type)
{
$start_time=$arr_cdr_field[25];
}
#定义话单的第9个字段Duration
$duration=$arr_cdr_field[13];
#定义转换后话单的第10个字段Success.
$success=$arr_cdr_field[17];
#定义转换后话单的第11个字段DD_TYPE
$dd_type="";
#51类型
if("51" eq $rec_type)
{
#含有"+"号码为手机
if($is_sp_or_email2 !=-1)
{
#以+号开始写05
#以8开始的号码写06
#其他填写空
$dd_type="05";
if($dialed =~ /^8/)
{
$dd_type="06";
}
if($dialed =~ /^9/)
{
$dd_type="";
}
}
#52类型
}
elsif("52" eq $rec_type)
{
#含有“+”号码为手机
if($is_sp_or_email1 != -1)
{
#以+号开始写05
#以8开始的号码写06
#其他填写空
$dd_type="05";
if($dialed =~ /^8/)
{
$dd_type="06";
}
if($dialed =~ /^9/)
{
$dd_type="";
}
}
}
#定义转换后话单的第12个字段CALL_TYPE
#先填空
$sessionID=$arr_cdr_field[40];
$call_type="";
if ("" ne $sessionID)
{
$call_type="M0";
}
if($is_sp_or_email1 != -1)
{
if($country_code_index1!=-1)
{
#去国家吗
$dialed=substr($arr_cdr_field[4],length($country_code));
}else
{
#加“00”
#$dialed="00" . substr($arr_cdr_field[4],1);
$dialed= substr($arr_cdr_field[4],1);
}
}
else
{
$dialed=$arr_cdr_field[4];
}
}
#定义转换后话单的第8个字段Start_Time
$start_time=$arr_cdr_field[24];
if ("52" eq $rec_type)
{
$start_time=$arr_cdr_field[25];
}
#定义话单的第9个字段Duration
$duration=$arr_cdr_field[13];
#定义转换后话单的第10个字段Success.
$success=$arr_cdr_field[17];
#定义转换后话单的第11个字段DD_TYPE
$dd_type="";
#51类型
if("51" eq $rec_type)
{
#含有"+"号码为手机
if($is_sp_or_email2 !=-1)
{
#以+号开始写05
#以8开始的号码写06
#其他填写空
$dd_type="05";
if($dialed =~ /^8/)
{
$dd_type="06";
}
if($dialed =~ /^9/)
{
$dd_type="";
}
}
#52类型
}
elsif("52" eq $rec_type)
{
#含有“+”号码为手机
if($is_sp_or_email1 != -1)
{
#以+号开始写05
#以8开始的号码写06
#其他填写空
$dd_type="05";
if($dialed =~ /^8/)
{
$dd_type="06";
}
if($dialed =~ /^9/)
{
$dd_type="";
}
}
}
#定义转换后话单的第12个字段CALL_TYPE
#先填空
$sessionID=$arr_cdr_field[40];
$call_type="";
if ("" ne $sessionID)
{
$call_type="M0";
}
10 楼
luogen33
2012-05-11
#定义转换后话单的第2个字段 Rec_Number.
#$rec_number=&ch_num_to_64($arr_cdr_field[0]);
#采用动态生成
$rec_number=get_rec_number();
#定义转换后话单的第5个字段IMSI
$imsi=$arr_cdr_field[2];
#是不是邮件地址,或sp
$is_sp_or_email1=index($arr_cdr_field[4],"+");
$is_sp_or_email2=index($arr_cdr_field[5],"+");
#是不是本国国家码
$country_code_index1=index($arr_cdr_field[4],$country_code);
$country_code_index2=index($arr_cdr_field[5],$country_code);
#定义转换后话单的第6个字段 Msisdn 及第7个字段Dialed
#51类型
if("51" eq $rec_type)
{
#含有“+” 号码为手机
if ( $is_sp_or_email1 !=-1)
{
if ($country_code_index1!=-1)
{
#去掉国家吗
$msisdn=substr($arr_cdr_field[4],length($country_code));
}else{
# 加"00"
# $msisdn="00" . substr($arr_cdr_field[4],1);
$msisdn= substr($arr_cdr_field[4],1);
}
}
else
{
$msisdn=$arr_cdr_field[4];
}
#含有"+"号码为手机
if($is_sp_or_email2 !=-1)
{
if ($country_code_index2!=-1)
{
#去掉国家吗
$dialed=substr($arr_cdr_field[5],length($country_code));
}
else
{
# 加"00"
#$dialed="00" . substr($arr_cdr_field[5],1);
$dialed= substr($arr_cdr_field[5],1);
}
}
else
{
$dialed=$arr_cdr_field[5];
}
#52类型
}
elsif("52" eq $rec_type)
{
#含有“+”号码为手机.
if ($is_sp_or_email2 !=-1)
{
if($country_code_index2 !=-1)
{
#去国家吗
$msisdn=substr($arr_cdr_field[5],length($country_code));
}else
{
#加“00”
#$msisdn= "00". substr($arr_cdr_field[5],1);
$msisdn= substr($arr_cdr_field[5],1);
}
}
else
{
$msisdn=$arr_cdr_field[5];
}
#$rec_number=&ch_num_to_64($arr_cdr_field[0]);
#采用动态生成
$rec_number=get_rec_number();
#定义转换后话单的第5个字段IMSI
$imsi=$arr_cdr_field[2];
#是不是邮件地址,或sp
$is_sp_or_email1=index($arr_cdr_field[4],"+");
$is_sp_or_email2=index($arr_cdr_field[5],"+");
#是不是本国国家码
$country_code_index1=index($arr_cdr_field[4],$country_code);
$country_code_index2=index($arr_cdr_field[5],$country_code);
#定义转换后话单的第6个字段 Msisdn 及第7个字段Dialed
#51类型
if("51" eq $rec_type)
{
#含有“+” 号码为手机
if ( $is_sp_or_email1 !=-1)
{
if ($country_code_index1!=-1)
{
#去掉国家吗
$msisdn=substr($arr_cdr_field[4],length($country_code));
}else{
# 加"00"
# $msisdn="00" . substr($arr_cdr_field[4],1);
$msisdn= substr($arr_cdr_field[4],1);
}
}
else
{
$msisdn=$arr_cdr_field[4];
}
#含有"+"号码为手机
if($is_sp_or_email2 !=-1)
{
if ($country_code_index2!=-1)
{
#去掉国家吗
$dialed=substr($arr_cdr_field[5],length($country_code));
}
else
{
# 加"00"
#$dialed="00" . substr($arr_cdr_field[5],1);
$dialed= substr($arr_cdr_field[5],1);
}
}
else
{
$dialed=$arr_cdr_field[5];
}
#52类型
}
elsif("52" eq $rec_type)
{
#含有“+”号码为手机.
if ($is_sp_or_email2 !=-1)
{
if($country_code_index2 !=-1)
{
#去国家吗
$msisdn=substr($arr_cdr_field[5],length($country_code));
}else
{
#加“00”
#$msisdn= "00". substr($arr_cdr_field[5],1);
$msisdn= substr($arr_cdr_field[5],1);
}
}
else
{
$msisdn=$arr_cdr_field[5];
}
9 楼
luogen33
2012-05-11
while ($current_count < @records)
{
#获取其中一条计费话单
my @arr_cdr_field = split (/\,/, $records[$current_count]);
#如果原始话单记录,区域码为空时.
if ("" eq $arr_cdr_field[23])
{
$arr_cdr_field[23]=10000000;
}
#如果区域码配置有误.
my $macth=0;
foreach $areacode (keys %area_dir_map)
{
if ($areacode eq $arr_cdr_field[23])
{
$macth++;
}
}
if (!$macth)
{
$arr_cdr_field[23]=10000000;
#区域码配置有误时,做日志
if ($log_times==0)
{
#printlog "some area codes in config file :$INIFile is configed error !";
#printlog "the bill records of those areas ,are stored into the default dir : $area_dir_map{10000000}!";
$log_times++;
}
}
#根据原始话单记录的第24位(区域码),进行匹配. 将转换后的话单,写到匹配上的区域目录下的临时文件.
foreach $areacode (keys %area_dir_map)
{
#获得话单记录中区域号 ,根据区域号不同将记录写道不同话单目录.
#if ($areacode eq $arr_cdr_field[$#arr_cdr_field-1])
if ($areacode == $arr_cdr_field[23])
{
#定义转换后话单的第1个字段 Rec_Type .
$rec_type="52";
if ($arr_cdr_field[7] <= 2 )
{
$rec_type="51";
}
8 楼
luogen33
2012-05-11
elsif ($flag==1)
{
#五位二进制,就一位为一时.
if (1==$tmp_28_w[0])
{
$type_1_ser="1"
}
if (1==$tmp_28_w[1])
{
$type_1_ser="2"
}
if (1==$tmp_28_w[2])
{
$type_1_ser="4"
}
if (1==$tmp_28_w[3])
{
$type_1_ser="8"
}
if (1==$tmp_28_w[4])
{
$type_1_ser="16"
}
}
return $type_1_ser;
}
#用来做话单分拣的方法.
sub read_bill_record
{
#MMSC-ID+日期+序列号
#获取话单目录的所有话单文件
#
if(!opendir(handledir,$src_cdr_path))
{
printlog "$src_cdr_path not exist!";
return -1;
}
#
printlog "begin processing cdr file in directory:$src_cdr_path!";
#读取每一个文件
my $file_index = 0;
my @arr_record;
my $record_index = 0;
my (%arr_cdr_field, $Item);
my $dest_cdr_file_name = "";
my $src_cdr_file = "";
my $log_times=0;
while (defined($src_cdr_file = readdir(handledir)))
{
#获取每一个话单文件,并且进行读取
if (("." eq $src_cdr_file) || (".." eq $src_cdr_file) || ($src_cdr_file !~/^[0-9]{8,}.[0-9]{4}$/ ))
{
next;
}
#
$cdr_file = "$src_cdr_path/$src_cdr_file";
#清空数组
@records=();
if(open(fCdrHandle, "$cdr_file"))
{
#如果文件正常打开,
#现在每个目录下面 打开几个临时文件
foreach $areacode (keys %area_dir_map)
{
$dest_cdr_file_name = "$change_tmp_dir/$tmp_child_dirs{$areacode}/" . "." . "$src_cdr_file.tmp";
open($areacode,">>$dest_cdr_file_name");
}
#打开临时备份文件
#生成保存mmsid number 的文件
my $bak_dir_tmp = &bak_dir_tmp();
$bak_tmp_file = "$bak_dir_tmp/" . "." ."$src_cdr_file.tmp";
open(BAK_TMP_FILE,">>$bak_tmp_file");
#读整个文件
@records=<fCdrHandle>;
my $current_count=0;
7 楼
luogen33
2012-05-11
# 将十进制转换为64进制的方法
$arr="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/";
sub ch_num_to_64(){
#参数
my @list_data=();
my $res_data;
my $res =$_[0];
if (int($res)==0){
$res_data=0;
}
my $res2;
while($res != 0)
{
$res2 = $res%64;
push(@list_data,substr($arr,$res2,1));
$res = int($res/64);
}
@list_data=reverse (@list_data);
foreach $item (@list_data){
$res_data.=$item;
}
return $res_data;
}
#转换后的话单序列号
#$arr_cdr_field[0]=$_[0] 原始话单的序列号
#1116160948004901012071000
sub changebill_sequence_no_new_no2()
{
#time
#从原始话单序列号中获得HHMM的时间.
my $param_0=$_[0];
my $test_time=substr($param_0,4,4);
#sequence_no
my $sequence_no=substr($param_0,$len-9,5);
my $mod_id=substr($sequence_no,1,1);
my $manager_id =substr($sequence_no,2,1);
my $seq_id=substr($sequence_no,3,2);
#water_id
my $water_id=substr($param_0,$len-2,2);
my $rest=$test_time.$mod_id.$manager_id.$seq_id.$water_id;
return $rest;
}
#获取新话单第16个字段
#定义话单的第16个字段 Type_1_Ser
#获取原始话单第28个字段的值.
#传参$_[0]= $arr_cdr_field[27]
sub changebilltype_1_ser_new_no16()
{
$tmp_28_data=$_[0];
$tmp_28_w[0]=substr($tmp_28_data,0,1);
$tmp_28_w[1]=substr($tmp_28_data,1,1);
$tmp_28_w[2]=substr($tmp_28_data,2,1);
$tmp_28_w[3]=substr($tmp_28_data,3,1);
$tmp_28_w[4]=substr($tmp_28_data,4,1);
my $flag=0;
foreach $tmp_item (@tmp_28_w)
{
if (1==$tmp_item)
{
$flag +=1;
}
}
if ($flag > 1)
{
#五位二进制有多位为1.
#新话单16位填16.
$type_1_ser="16";
}
elsif ($flag==0)
{
#五位二进制都为0
#暂且填"16"
$type_1_ser="16";
}
6 楼
luogen33
2012-05-11
#生成保存mmsid number的文件
sub create_curr_num_file
{
#生成保存mmsid number 的文件
$curr_num_file="$config_files_dir/.current_num.cfg";
if(! -e "$curr_num_file")
{
`touch $curr_num_file`;
}
}
#初始化目录及文件
sub init_dirs_and_files
{
#初始化目录
&mark_areadir_and_tmpdir();
#初始化文件
&create_curr_num_file();
}
#将16进制ip地址,转换为10进制
sub trans_ip
{
my $src = $_[0];
my $des = "";
my $size = length($src);
if ($size !=
{
return $des;
}
$_ = $src;
if (/[\dA-Fa-f]{8}/)
{
my $tmp;
$tmp=hex (substr($src,0,2));
$des=$tmp;
$tmp=hex (substr($src,2,2));
$des=$des . "." . "$tmp";
$tmp=hex (substr($src,4,2));
$des=$des . "." . "$tmp";
$tmp=hex (substr($src,6,2));
$des=$des . "." . "$tmp";
}
return $des;
}
sub trans_hex
{
my $src = $_[0];
my $des = "";
my $size = length($src);
if ($size == 0)
{
return $des;
}
$_ = $src;
if (/^[\dA-Fa-f]+$/)
{
$des = hex($src);
}
return $des;
}
5 楼
luogen33
2012-05-11
#保存当前 mmsid number
sub writeCurr_num
{
#当前mmsid
open(CURR_NUM,">$curr_num_file");
printf CURR_NUM $curr_num;
close CURR_NUM;
}
#获得rec_number的方法
sub get_rec_number
{
#获得当前rec_number
my $temp_curr_num=$curr_num++;
#判断是不是合法
#超过最大值时,归1
if ( $temp_curr_num >= 999_999_9999)
{
#范围超过归1
#modfiy DTS2012042107444 by lgg 2012-04-23 begin
$curr_num="1";
#modfiy DTS2012042107444 by lgg 2012-04-23 end
}
#当前rec_number长度
my $len = length($temp_curr_num);
#不够十位补0
my $rec_number="0" x (10-$len) .$temp_curr_num;
#返回rec_number
return $rec_number;
}
#获得临时备份目录
sub bak_dir_tmp
{
#分拣时,临时备份目录
my @ITC_ARR=split(/\//,$change_bak_dir);
my $ITC_last_index=$#ITC_ARR;
my $ITC_last_prefix=$ITC_ARR[$ITC_last_index];
return "$change_tmp_dir/$ITC_last_prefix";
}
#创建每个区域的分拣目录.
#及临时分拣目录
sub mark_areadir_and_tmpdir
{
#检测areadir是否存在
foreach $areadir (values %area_dir_map)
{
if(! -d $areadir)
{
system("mkdir -p $areadir");
}
}
#临时分拣目录
foreach $areacode (keys %area_dir_map)
{
if (! -d "$change_tmp_dir/$tmp_child_dirs{$areacode}")
{
system("mkdir -p $change_tmp_dir/$tmp_child_dirs{$areacode}");
}
}
#分拣时,临时备份目录
my $bak_dir_tmp = &bak_dir_tmp();
if (!-d "$bak_dir_tmp")
{
system("mkdir -p $bak_dir_tmp");
}
#分拣目录BAK 目录
if (!-d "$change_bak_dir")
{
system("mkdir -p $change_bak_dir");
}
#配置目录
if (!-d "$config_files_dir")
{
system("mkdir -p $config_files_dir");
}
}
sub writeCurr_num
{
#当前mmsid
open(CURR_NUM,">$curr_num_file");
printf CURR_NUM $curr_num;
close CURR_NUM;
}
#获得rec_number的方法
sub get_rec_number
{
#获得当前rec_number
my $temp_curr_num=$curr_num++;
#判断是不是合法
#超过最大值时,归1
if ( $temp_curr_num >= 999_999_9999)
{
#范围超过归1
#modfiy DTS2012042107444 by lgg 2012-04-23 begin
$curr_num="1";
#modfiy DTS2012042107444 by lgg 2012-04-23 end
}
#当前rec_number长度
my $len = length($temp_curr_num);
#不够十位补0
my $rec_number="0" x (10-$len) .$temp_curr_num;
#返回rec_number
return $rec_number;
}
#获得临时备份目录
sub bak_dir_tmp
{
#分拣时,临时备份目录
my @ITC_ARR=split(/\//,$change_bak_dir);
my $ITC_last_index=$#ITC_ARR;
my $ITC_last_prefix=$ITC_ARR[$ITC_last_index];
return "$change_tmp_dir/$ITC_last_prefix";
}
#创建每个区域的分拣目录.
#及临时分拣目录
sub mark_areadir_and_tmpdir
{
#检测areadir是否存在
foreach $areadir (values %area_dir_map)
{
if(! -d $areadir)
{
system("mkdir -p $areadir");
}
}
#临时分拣目录
foreach $areacode (keys %area_dir_map)
{
if (! -d "$change_tmp_dir/$tmp_child_dirs{$areacode}")
{
system("mkdir -p $change_tmp_dir/$tmp_child_dirs{$areacode}");
}
}
#分拣时,临时备份目录
my $bak_dir_tmp = &bak_dir_tmp();
if (!-d "$bak_dir_tmp")
{
system("mkdir -p $bak_dir_tmp");
}
#分拣目录BAK 目录
if (!-d "$change_bak_dir")
{
system("mkdir -p $change_bak_dir");
}
#配置目录
if (!-d "$config_files_dir")
{
system("mkdir -p $config_files_dir");
}
}
4 楼
luogen33
2012-05-11
if($count_p>0)
{
#删除每个目录下的.tmp文件
for $areacode (keys %area_dir_map)
{
unlink "$change_tmp_dir/$tmp_child_dirs{$areacode}/$area_tmp_file";
}
#删除.tmp文件
my $bak_dir_tmp = &bak_dir_tmp();
unlink "$bak_dir_tmp/" . "." ."$src_cdr_file.tmp";
}
else
{
#获取当前系统时间HHMMSS
my $date = `date +'%H%M%S'`;
#去换行符
chomp($date);
#当对应的原始话单文件不存在时,更改名字
$new_file_name= $mmsc_id."-". $host_name . "-". substr($src_cdr_file,-13,-5) ."$date"."-" . substr($src_cdr_file,-4);
for $areacode (keys %area_dir_map)
{
#目标文件夹
copy "$change_tmp_dir/$tmp_child_dirs{$areacode}/$area_tmp_file" ,"$area_dir_map{$areacode}/$new_file_name";
#删掉.tmp文件
unlink "$change_tmp_dir/$tmp_child_dirs{$areacode}/$area_tmp_file";
}
#重命名备份文件
my $bak_dir_tmp = &bak_dir_tmp();
copy "$bak_dir_tmp/" . "." ."$src_cdr_file.tmp" , "$change_bak_dir/$new_file_name";
unlink "$bak_tmp_file";
}
}
}
#关闭各个区域的分拣目录
closedir $areacode;
}
#关闭原始话单目录
closedir SOR_PATH;
}
#读取当前mmsid number
sub getCurr_num
{
my $tmp_curr_num=1;
my $config_lines=0;
#读取当前mmsid
open(CURR_NUM,"<$curr_num_file");
while($line=<CURR_NUM>)
{
#读取到不为null的行
$line=~s/^\s*|\s*$//g;
if (length($line)!=0&&$line=~/^\d{1,10}$/)
{
$tmp_curr_num=$line;
$config_lines++;
}
}
#配置了多个数字
if ($config_lines>1)
{
print "can't config more than one curr_nums in the config file[$curr_num_file] EXIT .\n";
print "please config the curr_num again ,the curr_num must be in [1--999_999_9999]\n";
exit;
}
$curr_num=$tmp_curr_num;
close CURR_NUM;
}
#插件异常处理
sub before_start
{
#转换过程中话单中断
&error_bill_press();
#获取当前要用的MMSID number
&getCurr_num();
}
{
#删除每个目录下的.tmp文件
for $areacode (keys %area_dir_map)
{
unlink "$change_tmp_dir/$tmp_child_dirs{$areacode}/$area_tmp_file";
}
#删除.tmp文件
my $bak_dir_tmp = &bak_dir_tmp();
unlink "$bak_dir_tmp/" . "." ."$src_cdr_file.tmp";
}
else
{
#获取当前系统时间HHMMSS
my $date = `date +'%H%M%S'`;
#去换行符
chomp($date);
#当对应的原始话单文件不存在时,更改名字
$new_file_name= $mmsc_id."-". $host_name . "-". substr($src_cdr_file,-13,-5) ."$date"."-" . substr($src_cdr_file,-4);
for $areacode (keys %area_dir_map)
{
#目标文件夹
copy "$change_tmp_dir/$tmp_child_dirs{$areacode}/$area_tmp_file" ,"$area_dir_map{$areacode}/$new_file_name";
#删掉.tmp文件
unlink "$change_tmp_dir/$tmp_child_dirs{$areacode}/$area_tmp_file";
}
#重命名备份文件
my $bak_dir_tmp = &bak_dir_tmp();
copy "$bak_dir_tmp/" . "." ."$src_cdr_file.tmp" , "$change_bak_dir/$new_file_name";
unlink "$bak_tmp_file";
}
}
}
#关闭各个区域的分拣目录
closedir $areacode;
}
#关闭原始话单目录
closedir SOR_PATH;
}
#读取当前mmsid number
sub getCurr_num
{
my $tmp_curr_num=1;
my $config_lines=0;
#读取当前mmsid
open(CURR_NUM,"<$curr_num_file");
while($line=<CURR_NUM>)
{
#读取到不为null的行
$line=~s/^\s*|\s*$//g;
if (length($line)!=0&&$line=~/^\d{1,10}$/)
{
$tmp_curr_num=$line;
$config_lines++;
}
}
#配置了多个数字
if ($config_lines>1)
{
print "can't config more than one curr_nums in the config file[$curr_num_file] EXIT .\n";
print "please config the curr_num again ,the curr_num must be in [1--999_999_9999]\n";
exit;
}
$curr_num=$tmp_curr_num;
close CURR_NUM;
}
#插件异常处理
sub before_start
{
#转换过程中话单中断
&error_bill_press();
#获取当前要用的MMSID number
&getCurr_num();
}
3 楼
luogen33
2012-05-11
#需要备份文件
my $log_exist =1 if -e $LOGFile;
if ($log_exist == 1)
{
#判断一下当前的文件大小,如果大于10M,那么更换一个新文件
#my $timestamp = gmtime;
my $log_bak = 0;
$log_bak = 1 if -s $LOGFile >= 20480000;
#需要备份文件
if ($log_bak == 1)
{
#日志备份
#my $timestamp = gmtime;
#my $new_file_name = "decompose.log." . "$timestamp";
#rename "decompose.log", "$new_file_name";
#日志回滚
if ($open_log==1)
{
close LOG;
}
unlink "$LOGFile";
}
}
#处理分拣异常
sub error_bill_press
{
#打开原始话单目录
opendir SOR_PATH , $src_cdr_path;
foreach $areacode (keys %area_dir_map)
{
#打开各个区域的分拣目录
opendir $areacode , "$change_tmp_dir/$tmp_child_dirs{$areacode}";
foreach $area_tmp_file (readdir $areacode)
{
my $count_p=0;
#排除. 或..的文件
if (("." eq $area_tmp_file) || (".." eq $area_tmp_file))
{
next;
}
#如果区域的分拣目录中含有.tmp的文件.
if ($area_tmp_file =~ /^.[0-9]{8,}.[0-9]{4}.tmp$/)
{
$src_cdr_file=substr($area_tmp_file,1,length($area_tmp_file)-5);
#chomp($src_cdr_file); 文件名字不可有换行符,注释掉该行
foreach $src_cdr_f (readdir SOR_PATH)
{
#排除. 或..的文件
if (("." eq $src_cdr_f) || (".." eq $src_cdr_f)||($src_cdr_f!~/[0-9]{8,}.[0-9]{4}$/) )
{
next;
}
#chomp($src_cdr_f); 文件名字不可有换行符,注释掉该行
if($src_cdr_f eq $src_cdr_file)
{
$count_p++;
last;
}
}
2 楼
luogen33
2012-05-11
if (/AREA_DIR_ITEM/)
{
my @arr=split(/=/,$_);
my @area_dir_item=split(",",$arr[1]);
#转换配置文件中的$HOME变量
$area_dir_item[1]=`echo $area_dir_item[1]`;
#去掉空格及换行符.
$area_dir_item[0]=~s/^\s*|\s*$//g;
$area_dir_item[1]=~s/^\s*|\s*$//g;
push @area_dir_map ,($area_dir_item[0],$area_dir_item[1]);
#获得tmp下面的文件夹名
my @arr_dirs=split(/\//,$area_dir_item[1]);
push @tmp_child_dirs , ($area_dir_item[0],$arr_dirs[@arr_dirs-1]);
}
$Item = 1;
}
$Item = 0;
%area_dir_map=@area_dir_map;
%tmp_child_dirs=@tmp_child_dirs;
close CONFIG;
}
}
#读配置文件
read_decompose_ini();
#定义log文件
$LOGFile = "$log_path/decompose.log";
#标识log打开
$open_log=0;
#打开log
if (! -d $log_path)
{
system("mkdir -p $log_path");
}
if (open LOG,">>$LOGFile")
{
$open_log=1;
}
#输入一个参数,参数值为打印字符串
sub printlog
{
#日志正常打开
if ($open_log == 1)
{
my $date = `date +'%Y%m%d%H%M%S'`;
chomp($date);
my $string = "[" . "$date". "]" . "[" . "$$" . "][" . "$_[0]" . "]";
print LOG "$string\n";
}
}
1 楼
luogen33
2012-05-11
#!/usr/bin/perl
use Time::Local;
use File::Copy;
#强制要求变量先声明,再使用
#use strict;
#根据原始计费话单.第24位字段将不同区域的话单
#分拣到不同的区域目录.
#同时对原始话单的记录格式,进行转换.
#write by 罗根根 2011-10-20
my $user = $ENV{'USER'};
if ($user eq "")
{
print "Not define USER in environment parameter!\n";
exit 0;
}
my $trans_num = `ps -fu $user | grep "decompose_bill.pl" | grep -v grep | grep -v su | wc -l`;
if ($trans_num >= 2 )
{
print "decompose_bill.pl is still running,exit!\n";
exit 0;
}
#加载配置文件
sub read_decompose_ini
{
#配置文件
my $INIFile = "decompose.ini";
#判断decompose.ini是否存在
if ( !-e $INIFile)
{
print "can not find the config file decompose.ini !\n";
exit;
}
#加载配置
if (open(CONFIG,"<$INIFile"))
{
@area_dir_map=();
@tmp_child_dirs=();
while (<CONFIG>)
{
#去掉配置文件中注释
if (m/^#+/)
{
next;
}
#解析配置项
$host_name= $1 if (m/^HOST_NAME\s*=\s*(.*)\s/i);
$mmsc_id= $1 if (m/^MMSC_ID\s*=\s*(.*)\s/i);
$country_tmp_code= $1 if (m/^COUNTRY_CODE\s*=\s*(.*)\s/i);
$country_code= "+" . $country_tmp_code;
$log_path = $1 if (m/^LOG_PATH\s*=\s*(.*)\s/i);
$src_cdr_path = $1 if (m/^SRC_CDR_PATH\s*=\s*(.*)\s/i);
$change_tmp_dir= $1 if (m/^CHANGE_TMP_DIR\s*=\s*(.*)\s/i);
$change_bak_dir= $1 if (m/^CHANGE_BAK_DIR\s*=\s*(.*)\s/i);
$config_files_dir= $1 if (m/^CONFIG_FILES_DIR\s*=\s*(.*)\s/i);
#转换配置文件中的$HOME变量(对配置文件中$HOME 的支持)
$log_path=`echo $log_path`;
$src_cdr_path=`echo $src_cdr_path`;
$change_tmp_dir=`echo $change_tmp_dir`;
$change_bak_dir=`echo $change_bak_dir`;
$config_files_dir=`echo $config_files_dir`;
#去空格及换行符.
$host_name=~s/^\s*|\s*$//g;
$mmsc_id=~s/^\s*|\s*$//g;
$country_code=~s/^s*|\s*$//g;
$log_path=~s/^\s*|\s*$//g;
$src_cdr_path=~s/^\s*|\s*$//g;
$change_tmp_dir=~s/^\s*|\s*$//g;
$change_bak_dir=~s/^\s*|\s*$//g;
$config_files_dir=~s/^\s*|\s*$//g;
use Time::Local;
use File::Copy;
#强制要求变量先声明,再使用
#use strict;
#根据原始计费话单.第24位字段将不同区域的话单
#分拣到不同的区域目录.
#同时对原始话单的记录格式,进行转换.
#write by 罗根根 2011-10-20
my $user = $ENV{'USER'};
if ($user eq "")
{
print "Not define USER in environment parameter!\n";
exit 0;
}
my $trans_num = `ps -fu $user | grep "decompose_bill.pl" | grep -v grep | grep -v su | wc -l`;
if ($trans_num >= 2 )
{
print "decompose_bill.pl is still running,exit!\n";
exit 0;
}
#加载配置文件
sub read_decompose_ini
{
#配置文件
my $INIFile = "decompose.ini";
#判断decompose.ini是否存在
if ( !-e $INIFile)
{
print "can not find the config file decompose.ini !\n";
exit;
}
#加载配置
if (open(CONFIG,"<$INIFile"))
{
@area_dir_map=();
@tmp_child_dirs=();
while (<CONFIG>)
{
#去掉配置文件中注释
if (m/^#+/)
{
next;
}
#解析配置项
$host_name= $1 if (m/^HOST_NAME\s*=\s*(.*)\s/i);
$mmsc_id= $1 if (m/^MMSC_ID\s*=\s*(.*)\s/i);
$country_tmp_code= $1 if (m/^COUNTRY_CODE\s*=\s*(.*)\s/i);
$country_code= "+" . $country_tmp_code;
$log_path = $1 if (m/^LOG_PATH\s*=\s*(.*)\s/i);
$src_cdr_path = $1 if (m/^SRC_CDR_PATH\s*=\s*(.*)\s/i);
$change_tmp_dir= $1 if (m/^CHANGE_TMP_DIR\s*=\s*(.*)\s/i);
$change_bak_dir= $1 if (m/^CHANGE_BAK_DIR\s*=\s*(.*)\s/i);
$config_files_dir= $1 if (m/^CONFIG_FILES_DIR\s*=\s*(.*)\s/i);
#转换配置文件中的$HOME变量(对配置文件中$HOME 的支持)
$log_path=`echo $log_path`;
$src_cdr_path=`echo $src_cdr_path`;
$change_tmp_dir=`echo $change_tmp_dir`;
$change_bak_dir=`echo $change_bak_dir`;
$config_files_dir=`echo $config_files_dir`;
#去空格及换行符.
$host_name=~s/^\s*|\s*$//g;
$mmsc_id=~s/^\s*|\s*$//g;
$country_code=~s/^s*|\s*$//g;
$log_path=~s/^\s*|\s*$//g;
$src_cdr_path=~s/^\s*|\s*$//g;
$change_tmp_dir=~s/^\s*|\s*$//g;
$change_bak_dir=~s/^\s*|\s*$//g;
$config_files_dir=~s/^\s*|\s*$//g;
相关推荐
"Perl学习手札中文"是一份专为初学者设计的学习资料,旨在帮助读者快速掌握Perl语言的基础和高级特性。以下是对这些文件内容的概览: 1. **word.css**: 这个文件可能是样式表,用于定义文档中的排版和格式。在学习...
学会如何编写和使用正则表达式进行模式匹配、替换和分割字符串是Perl学习的重点。 3. **文件和目录操作**:Perl提供了丰富的内建函数来处理文件和目录,如 `open()`、`close()`、`<FILEHANDLE>`、`print FILEHANDLE...
"perl学习ppt全集"是一份详尽的教程资料,旨在帮助初学者和有经验的程序员深入理解Perl语言的核心概念和高级特性。这份资料可能包含一系列的PPT幻灯片,每一份都专注于不同的主题,旨在通过清晰的讲解和实例来提升...
关于作者: 简信昌 “傲尔网”专案经理 博仲法律事务所资讯部门 台北Perl推广组 (Taipei.pm) 召集人 Newzilla召集人 目前专案: Open Source Foundry (OSSF) Newzilla 线上杂志 ...“Perl学习手札”
这篇"Perl学习文档"包含了对Perl语言的全面介绍,无论你是初学者还是有一定经验的开发者,都可以从中受益。 文档可能涵盖了以下几个重要的Perl知识点: 1. **Perl基础语法**:Perl的语法规则和C语言类似,包括变量...
"超好perl学习教程"可能是一套全面的教育资源,旨在帮助初学者和有经验的开发者提升Perl编程技能。 首先,Perl的语法简洁且灵活,它借鉴了C、sed、awk等语言的特性,使得编写代码既快速又高效。Perl中的变量类型...
总的来说,Perl学习简明教程会涵盖以上所述的基础知识,包括但不限于变量、流程控制、字符串和正则表达式、文件操作、模块使用等。通过学习这个教程,你将能够理解和编写基本的Perl脚本,进一步探索其在实际问题中的...
这份"Perl学习手札"是为那些想要深入理解Perl语言特性和应用的初学者或有一定经验的开发者准备的宝贵资源。 首先,Perl的核心特性在于其灵活性和表达力。Perl语法受到了C、sed、awk等多种语言的影响,这使得它在...
### 非常著名的Perl学习手札(初学者有福了) #### 1. 关于Perl5 **1.1 Perl的历史** Perl是由Larry Wall在1987年开发的一种高级编程语言,最初的设计目的是为了简化文本处理任务,后来发展成为一种功能强大的...
#### 一、Perl语言概览与学习指南 **知识点1:Perl语言背景与特点** Perl是由Larry Wall于1987年开发的一种高级编程语言,设计初衷是解决文本处理和系统管理任务。它融合了C、shell scripting、awk和sed等语言的...
Perl是一种强大的脚本编程语言,...以上就是Perl学习笔记中涵盖的一些基础概念和操作。继续深入学习,你将能够编写更复杂的Perl脚本,解决各种实际问题。记得实践是学习编程的关键,多做练习,逐步提升你的Perl技能。
### Perl学习总结知识点详解 #### 一、执行Perl程序的方法 Perl是一种强大的脚本语言,广泛应用于各种场景,包括系统管理、Web开发等。要执行一个Perl程序,首先要确保已经安装了Perl解释器。 - **文件后缀**:...
Perl学习手札.chmPerl学习手札.chmPerl学习手札.chm
"perl学习相关的内容"这个标题表明我们即将探讨的是关于Perl语言的学习资料,可能是教程、代码示例或者练习题。描述中提到的“经典文档”可能是指一些权威的Perl教程,帮助初学者掌握基础,并全面了解Perl编程。 ...
Perl是一种高级的、通用的、解释型、...总的来说,"Perl学习资料.zip"可能包含了以上各个方面的教程、示例代码和练习,帮助学习者逐步掌握Perl编程。通过深入学习和实践,你可以利用Perl的强大功能解决各种实际问题。
### Perl学习笔记参考 #### Perl简介 Perl是一种高级编程语言,全称为Practical Extraction and Report Language,由Larry Wall创建,并持续由他进行更新与维护。Perl最初被设计用于Unix环境下的编程任务,随着...
这份"经典Perl学习资料"的压缩包显然包含了深入学习Perl的讲义,可以帮助你全面理解并掌握这种语言的核心概念和技术。 Perl的起源可以追溯到1987年,由Larry Wall开发,其设计哲学是“易于阅读,难于编写”。Perl...
"Perl学习资料 - 高清版"这个压缩包显然为初学者提供了高质量的学习资源,尤其是对于想要深入理解Perl语言的人来说,这是一个非常有价值的资料集。 首先,我们来看其中包含的文件"Perl语言入门(第四版).pdf"。这...