Написание нескольких файлов CSV с использованием Perl - PullRequest
0 голосов
/ 19 декабря 2011

Я пытаюсь создать несколько 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 ]

2 голосов
/ 19 декабря 2011

Это похоже на один из (очень распространенных) случаев, когда добавление use strict и use warnings в начало вашей программы поможет вам легко отследить проблему.

В частности, строки:

my $cisgeneref = \@cisgeneref;

и

my $cisref = \@cisref;

выглядит довольно подозрительно, так как они принимают ссылки на массивы (@cisgeneref и @cisref), которые вы ранее не использовали в программе.

Я подозреваю, что вы действительно хотели:

my $cisgeneref = \@Cisgene;

и

my $cisref = \@Cisarray;

Попытка написать код Perl без use strict и use warnings - ужасная идея.

0 голосов
/ 19 декабря 2011

Почему бы вам просто не напечатать строку в файлы без этих библиотек:

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: $!";

PS В моих определениях мой CSV не использует запятые, а вместо этого использует точку с запятой.Также настоятельно рекомендуется @davorg использовать строгие и предупреждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...