创建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();