2011-11-03 37 views
1

目前我正在开展我的考试项目,我需要一些帮助。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-> 
+1

对于@ @AoA,您不需要特殊情况来初始化数组。你可以将'push'推到一个空阵列上。你的bind_column是没用的,如果你不打算*使用变量来处理任何特定的事情。 – Axeman

+1

为什么不直接将tblExportspecificatie表中的格式化定义放入散列并使用'print FILE sprintf'格式化输出?假设你想要一些字段使用10个字符宽度,'my $ width = 10;我的$ type ='s'; printf(“%$ {width} $ {type}”,'flesk');'用5个前导空格打印“flesk”,其中$ width和$ type从定义表中拉出。 – flesk

+0

嗨@flesk,首先感谢您的评论!无论如何你可以帮助我更多,我更像是一个PHP家伙,但是学校特别要求PERL。我没有解决你的解决方案,目前我正在使用sprintf来修复它。功能pad2str正在这样做..所以现在的问题是,在某些部分填充显示和计数器混乱。 –

回答

2

格式代码的重要部分隐藏在pad2str中。问题似乎是你如何处理22栏与26场定义。我的猜测是,它不处理最后四个不存在的列。

在你给,你的场加起来不过254的长度的特定情况下,你似乎是在加入之初 2字符$tblnr值和'--'!那么你需要256或256 + 2(' - ')作为记录长度吗?

同样在给定长度的大while循环中,@AoA[0][1]常数,为什么要评价它26 x 5次?这是PHP或Perl中的错误代码。

  • 修复pad2str(你可能甚至都不需要。)
  • 决定是否要$tblnr开头或“ - ”在结束 - 或者决定你的记录长度应该是什么。
  • 并把该代码转换以下:

    use List::MoreUtils qw<pairwise>; 
    
    # push behavior into statement handles... 
    { package DBI::st; 
        sub get_rows { 
         my $sth = shift; 
         my @results; 
         $sth->execute(@_); 
         while (my @row = $sth->fetchrow_array) { 
          push @results, \@row; 
         } 
         $sth->close; 
         return @results; 
        } 
    } 
    
    my %needs_adjustment = qw<F0101 1 F6115 1>; 
    $expsel->bind_columns(\$tabelnaam, \$huidige, \$id); 
    while($expsel->fetch()) { 
    
        $tbl = substr($tabelnaam, 0, 4); 
        $tblnr = substr($tabelnaam, 2, 2); 
    
        my ($first_col) 
         = @AoA 
         = $dbh->prepare(qq/ 
          SELECT * 
          FROM tblExportspecificatie 
          WHERE tabelnaam = '$tbl' 
          ORDER BY id 
         /)->get_rows 
         ; 
    
        my $adjust_first = $needs_adjustment{ $first_col->[1] }; 
        $first_col->[2] = 8 if $adjust_first; 
        ($sth = $dba->prepare("SELECT * FROM $tbl LIMIT 5"))->execute; 
    
        while (my $row = $sth->fetchrow_arrayref) { 
         print $fh 
           $tblnr 
          , ($adjust_first ? pad2str(4, 0, $gemeentecode) : '') 
          , (pairwise { pad2str(@$a[2,3], $b) } @AoA, @$row) 
          , chr(10) 
          ; 
        } 
        print $fh chr(10); 
    } 
    
  • 希望printf,除非你要提供一个格式说明,可呈现你似乎没有这样做。

+0

哇,非常感谢!我现在工作:) –

0

您也可以使用Perl formats。它们是专门为此目的而创建的。