使用Perl编写多个CSV文件

时间:2011-12-19 10:09:36

标签: perl csv

我正在尝试创建多个CSV文件,我将用它将表格输入到Mysql中(我无法编写代码直接插入mysql,并认为这对我来说更容易编写,即使它有点复杂)。代码正确编译并创建文件,但只有第一个文件接收任何数据(并且第一个文件很好地进入mysql)。

use Text::CSV;
use IO::File;


my $GeneNumber = 4;
my @genearray;
my @Cisarray;
my @Cisgene;


$csv = Text::CSV->new ({ binary => 1, eol => $/ });
$iogene = new IO::File "> Gene.csv";
$iocis = new IO::File "> Cis.csv";
$iocisgene = new IO::File ">Cisgene.csv";

for(my $i=1; $i<=$GeneNumber; $i++)
    {
        @genearray=();

        push(@genearray, 'Gene'.$i);
        push(@genearray, rand());
    push(@genearray, rand());

    my $CisNumber=int(rand(2)+1);

    for (my $j=1;$j<=$CisNumber;$j++){
      @Cisgene=();
      @Cisarray=();

      push(@Cisgene, 'Gene'.$i);
      push(@Cisgene, 'Cis'.$i.$j);

      my $cisgeneref = \@cisgeneref;

      $status = $csv->print ($iocisgene, $cisgeneref);
      $csv->eol();

      push (@Cisarray, 'Cis'.$i.$j);
      push (@Cisarray, rand());

      my $cisref = \@cisref;

      $status = $csv->print ($iocis, $cisref);
      $csv->eol();
    }

    my $generef= \@genearray;

    $status = $csv->print ($iogene, $generef);
    $csv->eol();
}

我猜这个问题与

有关
 $status = $csv->print ($iocisgene, $cisgeneref);

我尝试创建三个版本:

 $csv = Text::CSV->new ({ binary => 1, eol => $/ });
然而,我仍遇到同样的问题。

由于

2 个答案:

答案 0 :(得分:2)

这看起来像是一种(非常常见的)案例,在程序的顶部添加use strictuse warnings可以帮助您轻松追踪问题。

特别是,行:

my $cisgeneref = \@cisgeneref;

my $cisref = \@cisref;

看起来很可疑,因为他们引用了您之前未在程序中使用的数组(@cisgeneref@cisref)。

我怀疑你真的想要:

my $cisgeneref = \@Cisgene;

my $cisref = \@Cisarray;

尝试在没有use strictuse warnings的情况下编写Perl代码是一个糟糕的主意。

答案 1 :(得分:0)

为什么不简单地将字符串打印到文件中,而不使用这些文件:

open GENE, ">", "Gene.csv" or print "Can't create new file: $!\n\n";
print GENE "This;could;be;a;CSV File\nWith;2 lines;and;5 columns;=)";
close GENE or print "Can't close file: $!";

P.S。在我的定义中,我的CSV不使用逗号,而是使用分号。 此外,强烈建议@davorg使用严格和警告。