CAM::DBF and Date::Simple 创建DBF文件

创建DBF文件

#enter:start and end date

#out :DBF file

 


# 3*3*2*2*$stylecode_num(stylecode)*(16/15 mult)*days
# =36*16*$stylecode_num=576*$stylecode_num*days

# ctype=1 mult16!='',ctype=2 mult16 =''


use strict;
use CAM::DBF;
use Date::Simple ('date', 'today','d8');

sub create_random
{
    my ($lower, $upper, $number) = @_;
    my @all_numbers;
    my %persent = (positive => 0.90,
                    negative => 0.09,
                    blank    => 0.01,);
       
     until (@all_numbers == $number)
    {
        my $temp_number = rand($upper);
        $temp_number = sprintf("%.4f", $temp_number);
        if ($temp_number >= $lower&&$temp_number!=0)
        {
            push @all_numbers, $temp_number;
        }else {next;}
     }
    # negative
    my $number_of_negative = int($persent{negative} * $number);
    my @element_need_to_convert_negative;
    my $i=0;
    while($i<$number_of_negative)
    {
        if($all_numbers[rand($number-1)])
        {
            push @element_need_to_convert_negative, rand($number-1);
            $i++;
        }
        else{next;}
    }        
    $all_numbers[$_] = -$all_numbers[$_] foreach @element_need_to_convert_negative;
   
     # blank persent
     my $number_of_blank = int($persent{blank} * $number);
     my @element_need_to_convert_blank;
 
     foreach (1..$number_of_blank) {
      push @element_need_to_convert_blank, rand($number-1);
     }
           
     $all_numbers[$_] = '' foreach @element_need_to_convert_blank;  
           
    return @all_numbers;
}
sub create_mults
{
    my $days=$_[0];
    my $num = $_[1];
    my $number = 576*$days*$num;
    my %limit = (lower => -1000,
             upper => 1000,);
    my @data = &create_random($limit{lower}, $limit{upper}, $number);
    return @data;
}
sub main
{
    our @coverage=(1,2,3);
    our @style=(1,2,3);
    our %stylecode=($style[0]=>['ZA01','ZA02','ZA03'],
                    $style[1]=>['ZB01','ZB02','ZB03'],
                    $style[2]=>['ZC01','ZC02','ZC03']);
    our $start =$ARGV[0];
    our $end =$ARGV[1];
    if ((!$start)||(!$end)){die "Please enter the start and end date/n";}
    our $first = date($start);
    our $last = date($end);
    our $days = date($end)-date($start)+1;
    if ($days>100){print "It's creating dbf file,please wait.../n";}
    our @ctype=(1,2);
    our @rtype =(1,2);
    our $id=1;
    our @line;
    our $dbf_name='CYCS_DAY'.$first->as_d8.'.DBF';
#-----------------create random numbers-------------
    our $stylecode_num =@{$stylecode{$style[0]}};
    our @random_numbers= create_mults($days,$stylecode_num);
#----------------create dbf file head------------------------------------
    my $dbf = CAM::DBF->create($dbf_name,
                           {name=>'id',type=>'N',length=>10,decimals=>0},
                           {name=>'tdate',type=>'C',length=>8,decimals=>0},
                           {name=>'coverage',type=>'C',length=>1,decimals=>0},
                           {name=>'style',type=>'C',length=>1,decimals=>0},
                           {name=>'stylecode',type=>'C',length=>100,decimals=>0},
                           {name=>'ctype',type=>'C',length=>1,decimals=>0},
                           {name=>'rtype',type=>'C',length=>1,decimals=>0},
                           {name=>'mult1',type=>'N',length=>19,decimals=>4},
                           {name=>'mult2',type=>'N',length=>19,decimals=>4},
                           {name=>'mult3',type=>'N',length=>19,decimals=>4},
                           {name=>'mult4',type=>'N',length=>19,decimals=>4},
                           {name=>'mult5',type=>'N',length=>19,decimals=>4},
                           {name=>'mult6',type=>'N',length=>19,decimals=>4},
                           {name=>'mult7',type=>'N',length=>19,decimals=>4},
                           {name=>'mult8',type=>'N',length=>19,decimals=>4},
                           {name=>'mult9',type=>'N',length=>19,decimals=>4},
                           {name=>'mult10',type=>'N',length=>19,decimals=>4},
                           {name=>'mult11',type=>'N',length=>19,decimals=>4},
                           {name=>'mult12',type=>'N',length=>19,decimals=>4},
                           {name=>'mult13',type=>'N',length=>19,decimals=>4},
                           {name=>'mult14',type=>'N',length=>19,decimals=>4},
                           {name=>'mult15',type=>'N',length=>19,decimals=>4},
                           {name=>'mult16',type=>'N',length=>19,decimals=>4},
    );
#------------------create dbf body------------------------------------/
 while ($first!=$last->next)
{  
    my $now =$first->as_d8 ;
    #rule out the day not work
    if(($first->day_of_week!=0)&&($first->day_of_week!=6))
    {
        foreach my $a(@coverage)
        {      
            foreach my $b(@style)
            {           
                foreach my $c(@{$stylecode{$b}})
                {              
                    foreach my $d(@ctype)
                    {                   
                        foreach my $e(@rtype)
                        {
                            push (@line,$id);
                            push (@line,$now);
                            push (@line,$a);
                            push (@line,$b);
                            push (@line,$c);
                            push (@line,$d);
                            push (@line,$e);
                            # push @mults to @line
                            my $i;
                            for $i(1..16)
                            {push(@line,$random_numbers[($id-1)*16+$i]);}
                            #ctype=2 mult16=''
                            if ($d==2){$line[22]='';}
                            # write to dbf
                            $dbf->appendrow_arrayref(/@line);
                            $id++;
                            @line=();
                        }
                    }
                }
            }
        }          
    }
    $first =$first->next;
 }
 $dbf->closeDB();
 print "Well done!";
}
main();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值