H码头csv文件处理。
时间:2008-10-18 来源:weicr
电信运营商结算用H码表都是以excel文档下发到各分公司,
然后由分公司相应人员插入到数据库表中,由于H码数量(行)/ 省市(列)每次数量都不一样,
因此很难运用先手工将excel文件导入到数据库表中,然后写个存储过程来取得相应的插入SQL语句的方法.
而且,每一省份的同一条线路又有N多码段,码段处于同一单元格中,用“、”号分开,
如有顺序码段,则用“-”开隔
eg
省市 1110H1H2H3 1103H1H2H3 。。。。。。每次下发都不同数量
湖南 023、046、078-083 011、033
上海 076-089
.....也就是说 对湖南的1110H1H2H3 有023 046 和078,079,080,081,082,083
每一码段都要生成一条记录。
每个月要插8、9百条记录,手工操用至少要一天时间才能确保准确全部录入,
很烦人。(主要是看走眼容易出错,错一条可不得了,总部下文批死人)
不过用上了 perl 一切就简单了。
先将excel文件打开另存为CSV文件,如下代码一秒钟就能取得所有插入语句,
核对下没啥问题就OK了。
#! /arrayacct/user/uniacc/perl/bin/perl
use strict;
use Fatal qw / open close / ;
open hm_file,"<",$ARGV[0]; #参数一
open insert_fd,">",$ARGV[1]; #参数二
my $line_no=undef; #CSV文件行号
my @field_name=undef; #总部下发的EXEL文档字段数组
my $seq=undef; #插入序列便于核对程序运行结果
##############################预设前导SQL###############################################
my $pre_sql="INSERT INTO hm_input_t(seq,stat_date,province,city,area_code,"
."hm_head,hm_body,hm_code) \n VALUES(";
while (my $line= <hm_file>) {
$line_no=$line_no+1;
if ($line_no == 1) {
chomp(@field_name=split ",",$line); #获取字段名数组
foreach (@field_name) {
s/^\s+|\s+$//g; #除掉微软^M
}
foreach my $field_index (3..$#field_name) {
if ($field_name[$field_index]=~/\d+/) { #取出H码头后回写到H码头数组
$field_name[$field_index]=$&;
}
}
}
else {
chomp(my @field_value=split ",",$line); #获取字段值
foreach (@field_value) {
s/^\s+|\s+$//g; #除掉微软回车加换行 ^M
}
####去除总部下发文件中的统计部分一般最下面两行####################################
if ($field_value[1] && $field_value[2]) {
foreach my $field_index (3..$#field_name) {
if ($field_value[$field_index]) {
chomp( my @sec=split "、",$field_value[$field_index]);
foreach my $context(@sec) {
$context=~s/^\s+|\s+$//g; #经测试^M无孔不入真骚
if ($context=~/\-/) {
my $down=$`;
my $up=$';
foreach ($down..$up) {
$seq=$seq+1;
s/^\s+|\s+$//g;
my $sql=$pre_sql.$seq.","
."TO_CHAR(SYSDATE,'YYYYMM')".","
."'".$field_value[0]."',"
."'".$field_value[1]."',"
."'".$field_value[2]."',"
."'".$field_name[$field_index]."',"
."'".$_."',"
."'".$field_nam[$field_index].$_."');"; print insert_fd $sql."\n";
}
}
else {
$seq=$seq+1;
my $sql= $pre_sql.$seq.","
."TO_CHAR(SYSDATE,'YYYYMM')".","
."'".$field_value[0]."',"
."'".$field_value[1]."',"
."'".$field_value[2]."',"
."'".$field_name[$field_index]."',"
."'".$context."',"
."'".$field_name[$field_index].$context."');"; print insert_fd $sql."\n";
}
}
}
}
}
}
}
close insert_fd;
close hm_file;
use strict;
use Fatal qw / open close / ;
open hm_file,"<",$ARGV[0]; #参数一
open insert_fd,">",$ARGV[1]; #参数二
my $line_no=undef; #CSV文件行号
my @field_name=undef; #总部下发的EXEL文档字段数组
my $seq=undef; #插入序列便于核对程序运行结果
##############################预设前导SQL###############################################
my $pre_sql="INSERT INTO hm_input_t(seq,stat_date,province,city,area_code,"
."hm_head,hm_body,hm_code) \n VALUES(";
while (my $line= <hm_file>) {
$line_no=$line_no+1;
if ($line_no == 1) {
chomp(@field_name=split ",",$line); #获取字段名数组
foreach (@field_name) {
s/^\s+|\s+$//g; #除掉微软^M
}
foreach my $field_index (3..$#field_name) {
if ($field_name[$field_index]=~/\d+/) { #取出H码头后回写到H码头数组
$field_name[$field_index]=$&;
}
}
}
else {
chomp(my @field_value=split ",",$line); #获取字段值
foreach (@field_value) {
s/^\s+|\s+$//g; #除掉微软回车加换行 ^M
}
####去除总部下发文件中的统计部分一般最下面两行####################################
if ($field_value[1] && $field_value[2]) {
foreach my $field_index (3..$#field_name) {
if ($field_value[$field_index]) {
chomp( my @sec=split "、",$field_value[$field_index]);
foreach my $context(@sec) {
$context=~s/^\s+|\s+$//g; #经测试^M无孔不入真骚
if ($context=~/\-/) {
my $down=$`;
my $up=$';
foreach ($down..$up) {
$seq=$seq+1;
s/^\s+|\s+$//g;
my $sql=$pre_sql.$seq.","
."TO_CHAR(SYSDATE,'YYYYMM')".","
."'".$field_value[0]."',"
."'".$field_value[1]."',"
."'".$field_value[2]."',"
."'".$field_name[$field_index]."',"
."'".$_."',"
."'".$field_nam[$field_index].$_."');"; print insert_fd $sql."\n";
}
}
else {
$seq=$seq+1;
my $sql= $pre_sql.$seq.","
."TO_CHAR(SYSDATE,'YYYYMM')".","
."'".$field_value[0]."',"
."'".$field_value[1]."',"
."'".$field_value[2]."',"
."'".$field_name[$field_index]."',"
."'".$context."',"
."'".$field_name[$field_index].$context."');"; print insert_fd $sql."\n";
}
}
}
}
}
}
}
close insert_fd;
close hm_file;
相关阅读 更多 +