目前我正在开展我的考试项目,我需要一些帮助。PERL数据库到文件
该脚本的目标是从MySQL数据库中选择数据并将其放入具有特定行长度甚至特定列长度的文件中。每个字段和更多化妆所需的长度位于不同的数据库中。迄今为止,所以我做了两个数组:一个用于组成(列DB1),另一个用于数据(DB2)。现在问题是每行必须有256个字符,这些填充符位于组成数据库中,但不在数据库中,所以在填充字段出现的地方,所有东西都会混乱起来。我尝试了大量的东西,但我无法弄清楚该做什么,而且自从我的考试项目以来,我的整个研究都依赖于它。
$expsel->bind_columns(\$tabelnaam,\$huidige,\$id);
while($expsel->fetch()) {
$tbl = substr($tabelnaam, 0,4);
$tblnr = substr($tabelnaam, 2,2);
$i = 0;
$exp_spec = $dbh->prepare("SELECT * FROM tblExportspecificatie WHERE tabelnaam = '".$tbl."' ORDER BY id");
$exp_spec->execute();
$exp_spec->bind_columns(\$id, \$tblnaam, \$vldnaam, \$vldlngte, \$ascii, \$telveld, \$tellen, \$keystring);
while($exp_spec->fetch()){
if($i == 0){
@AoA = ([ $tbl, $vldnaam, $vldlngte, $ascii, $telveld, $tellen, $keystring ]);
}else{
push @{ $AoA[$i] }, $tbl, $vldnaam, $vldlngte, $ascii, $telveld, $tellen, $keystring;
}
$i++;
}
$exp_spec->finish();
# Start regel wegschrijven aan het begin van de nieuwe tabel reeks
# printf FILE "10".$tblnr.pad2str(252, 1, "").chr(10);
$tbl_data = $dba->prepare("SELECT * FROM ".$tbl." LIMIT 5");
$tbl_data->execute();
$regels = $tbl_data->rows;
my @array;
while (my @arr = $tbl_data->fetchrow_array()) {
push @array,\@arr;
}
for($s = 0; $s < $regels; $s++){
for($x = 0; $x < $i; $x++){
if($x == 0){
if($AoA[0][1] eq "F0101" || $AoA[0][1] eq "F6115"){
printf FILE $tblnr.pad2str(4, 0, $gemeentecode).pad2str(8, $AoA[0][3], $array[$s][$x]);
}else{
printf FILE $tblnr.pad2str($AoA[0][2], $AoA[0][3], $array[$s][$x]);
}
}else{
printf FILE pad2str($AoA[$x][2], $AoA[$x][3], $array[$s][$x]);
}
}
printf FILE "--".chr(10);
}
printf FILE chr(10);
print Dumper @AoA;
print Dumper @array;
@$AoA = 0;
}
这里是阵列
$VAR1 = [
'st31',
'F0120',
'9',
'0',
'0',
'0',
''
];
$VAR2 = [
'st31',
'F1110',
'24',
'1',
'0',
'0',
''
];
$VAR3 = [
'st31',
'F1120',
'5',
'0',
'0',
'0',
''
];
$VAR4 = [
'st31',
'F1130',
'1',
'1',
'0',
'0',
''
];
$VAR5 = [
'st31',
'F1140',
'4',
'1',
'0',
'0',
''
];
$VAR6 = [
'st31',
'F1150',
'2',
'1',
'0',
'0',
''
];
$VAR7 = [
'st31',
'F1160',
'6',
'1',
'0',
'0',
''
];
$VAR8 = [
'st31',
'F1020',
'40',
'1',
'0',
'0',
''
];
$VAR9 = [
'st31',
'F1310',
'40',
'1',
'0',
'0',
''
];
$VAR10 = [
'st31',
'F8110',
'1',
'1',
'0',
'0',
''
];
$VAR11 = [
'st31',
'F8120',
'8',
'2',
'0',
'0',
''
];
$VAR12 = [
'st31',
'F8130',
'8',
'2',
'0',
'0',
''
];
$VAR13 = [
'st31',
'F1170',
'40',
'1',
'0',
'0',
''
];
$VAR14 = [
'st31',
'F0121',
'10',
'0',
'0',
'0',
''
];
$VAR15 = [
'st31',
'F0130',
'8',
'0',
'0',
'0',
''
];
$VAR16 = [
'st31',
'FILLER',
'4',
'1',
'0',
'0',
''
];
$VAR17 = [
'st31',
'F0140',
'10',
'0',
'0',
'0',
''
];
$VAR18 = [
'st31',
'F0220',
'2',
'1',
'0',
'0',
''
];
$VAR19 = [
'st31',
'FILLER',
'1',
'1',
'0',
'0',
''
];
$VAR20 = [
'st31',
'F0410',
'1',
'1',
'0',
'0',
''
];
$VAR21 = [
'st31',
'F0310',
'8',
'2',
'0',
'0',
''
];
$VAR22 = [
'st31',
'F0810',
'8',
'2',
'0',
'0',
''
];
$VAR23 = [
'st31',
'F0811',
'1',
'1',
'0',
'0',
''
];
$VAR24 = [
'st31',
'FILLER',
'5',
'1',
'0',
'0',
''
];
$VAR25 = [
'st31',
'F1010',
'1',
'1',
'0',
'0',
''
];
$VAR26 = [
'st31',
'FILLER',
'7',
'1',
'0',
'0',
''
];
$VAR1 = [
'170805955',
'Waterlelie ',
'16',
undef,
undef,
undef,
'3434VK',
'Nieuwegein ',
undef,
'I',
'2010-01-01',
'2011-01-01',
undef,
'356000000',
'0',
'2147483647',
undef,
'V',
'1946-10-24',
'0000-00-00',
'A',
'W'
];
所以我觉得这个问题是因为列数组有更多的数据,那么该数据的一个垃圾场,所以在填料点,计数器弄乱...这里的一些更多的调试数据:
<<DEBUG>> L-> 9 AS-> 0, DATA-> 170805955
<<DEBUG>> L-> 24 AS-> 1, DATA-> Waterlelie
<<DEBUG>> L-> 5 AS-> 0, DATA-> 16
<<DEBUG>> L-> 1 AS-> 1, DATA->
<<DEBUG>> L-> 4 AS-> 1, DATA->
<<DEBUG>> L-> 2 AS-> 1, DATA->
<<DEBUG>> L-> 6 AS-> 1, DATA-> 3434VK
<<DEBUG>> L-> 40 AS-> 1, DATA-> Nieuwegein
<<DEBUG>> L-> 40 AS-> 1, DATA->
<<DEBUG>> L-> 1 AS-> 1, DATA-> I
<<DEBUG>> L-> 8 AS-> 2, DATA-> 2010-01-01
<<DEBUG>> L-> 8 AS-> 2, DATA-> 2011-01-01
<<DEBUG>> L-> 40 AS-> 1, DATA->
<<DEBUG>> L-> 10 AS-> 0, DATA-> 356000000
<<DEBUG>> L-> 8 AS-> 0, DATA-> 0
<FILLER> <-- things are getting messy!
<<DEBUG>> L-> 4 AS-> 1, DATA-> 2147483647
<<DEBUG>> L-> 10 AS-> 0, DATA->
<<DEBUG>> L-> 2 AS-> 1, DATA-> V
<<DEBUG>> L-> 1 AS-> 1, DATA-> 1946-10-24
<<DEBUG>> L-> 1 AS-> 1, DATA-> 0000-00-00
<<DEBUG>> L-> 8 AS-> 2, DATA-> A
<<DEBUG>> L-> 8 AS-> 2, DATA-> W
<<DEBUG>> L-> 1 AS-> 1, DATA->
<<DEBUG>> L-> 5 AS-> 1, DATA->
<<DEBUG>> L-> 1 AS-> 1, DATA->
<<DEBUG>> L-> 7 AS-> 1, DATA->
对于@ @AoA,您不需要特殊情况来初始化数组。你可以将'push'推到一个空阵列上。你的bind_column是没用的,如果你不打算*使用变量来处理任何特定的事情。 – Axeman
为什么不直接将tblExportspecificatie表中的格式化定义放入散列并使用'print FILE sprintf'格式化输出?假设你想要一些字段使用10个字符宽度,'my $ width = 10;我的$ type ='s'; printf(“%$ {width} $ {type}”,'flesk');'用5个前导空格打印“flesk”,其中$ width和$ type从定义表中拉出。 – flesk
嗨@flesk,首先感谢您的评论!无论如何你可以帮助我更多,我更像是一个PHP家伙,但是学校特别要求PERL。我没有解决你的解决方案,目前我正在使用sprintf来修复它。功能pad2str正在这样做..所以现在的问题是,在某些部分填充显示和计数器混乱。 –