Почему я не вижу вычисленных результатов в моем выходном файле? - PullRequest
0 голосов
/ 15 марта 2012

Это продолжение до Как мне усреднить значения столбца из файла данных, разделенных табуляцией, игнорируя строку заголовка и левый столбец? .Задача была: открыть и прочитать файл;дойти до каждой строки, разбить содержимое на массив и вычислить среднее числовых значений;и, наконец, записать в новый файл средние значения для каждого из столбцов, содержащих числовые значения.

Кажется, все хорошо до конечной точки.Проблема в том, что, хотя я могу создать новый файл .txt, сам файл .txt не имеет того, что напечатано в выводе.Предпочтительно, как новый пользователь Perl, я бы предпочел сохранить скрипт в стиле, написанном ниже, чтобы я мог лучше понять его.Я не очень хорош с более краткими версиями, которые потенциально могут быть там.Спасибо jchips12 за значительную помощь.

В любом случае, код:

#!/usr/bin/perl -w
use strict;
my $infile = "Lab1_table.txt"; # This is the file path
open INFILE, $infile or die "Can't open $infile: $!";
my $outfile = "Lab1_tableoutput.txt";
open OUTFILE, ">$outfile" or die "Cannot open $outfile: $!";

my $count = 0;
my @header = ();
my @average = ();

while (<INFILE>) {
    chomp;
    my @columns = split /\t/;
    $count++;
    if ( $count == 1 ) {
        @header = @columns;
    } else {
        for( my $i = 1; $i < scalar @columns; $i++ ) {
            $average[$i] += $columns[$i];
        }
    }
}

for( my $i = 1; $i < scalar @average; $i++ ) {
    print $average[$i]/($count-1), "\n";
}

print OUTFILE "\n";
close OUTFILE;

Данные поступили из файла Lab1_table.txt следующим образом:

retrovirus      genome  gag     pol     env
HIV-1           9181    1503    3006    2571
FIV             9474    1353    2993    2571
KoRV            8431    1566    3384    1980
GaLV            8088    1563    3498    2058
PERV            8072    1560    3621    1532

В результате получаются правильные средние значения, хотя в терминале они немного грязные, и они не помечены в соответствии с каким-либо номером / именем столбца как таковым.Кроме того, создается файл .txt, но без вывода.

Результаты получаются как:

Argument "" isn't numeric in addition (+) at line 25, <INFILE> line X
0
8649.2
1509
3300.4
2142.4

***Line X: Where X is either 2, 3, 4, 5, or 6.***

Из этого я могу сделать вывод, что ошибки «Аргумент» относятся к5 столбцов заголовка и 0 к единственному столбцу с нечисловыми значениями.

Помогите получить файл для записи в файл .txt или каким-то образом, который я могу прочитать какпоказанный в командной строке будет высоко ценится.Кроме того, хотя я смутно знаю, что происходит на каждом этапе кода, я был бы признателен за более глубокое понимание того, что происходит на большинстве этапов, если это возможно.Я все еще читаю это, но более тонкие детали, которые я хочу, чтобы иметь возможность понять ясно.

1 Ответ

0 голосов
/ 15 марта 2012

Указание комментариев для каждой строки, чтобы дать вам четкое понимание

#!/usr/bin/perl -w 
use strict; 
use warnings;

my $infile = "Lab1_table.txt";                         # input file path 
open INFILE, $infile or die "Can't open $infile: $!";  # input file opened
my $outfile = "Lab1_tableoutput.txt";                  # output file path
open OUTFILE, ">$outfile" or die "Cannot open $outfile: $!"; # output file opened

my $count = 0;              # count variable to check for header row in file 
my @header = ();            # variable to store headers/column names of file
my @average = ();           # variable to store average calculated for each column

while (<INFILE>) {    
 chomp;
 my @columns = split /\s+/;   # \s stands for  [\ \t\r\n\f]
 $count++;    

 if ( $count == 1 ) {         
                    @header = @columns;      # executed only once for header 
      } 
 else {                                       # else column executed for remaining rows
        for( my $i = 1; $i < scalar @columns; $i++ ) {  # $i=1 means skip first column
              $average[$i] += $columns[$i];      # calcuate average for each row   
          }
      }
} 
for( my $i = 1; $i < scalar @average; $i++ ) {     

    print OUTFILE $average[$i]/($count-1), "\n";  # This will write to output file

    }     
close OUTFILE; 

Используйте print OUTFILE $average[$i]/($count-1), "\n"; для записи в файл.

Ошибка Argument "" isn't numeric in addition (+) at line 25, <INFILE> line X может быть, если значения в столбцах, которые вы добавляете, случайно содержат строку, а не число. Проверьте входной файл.

Примечание. Я не получаю сообщение об ошибке выше. JavaScript работает гладко с данными выше. Однако, если я изменяю число на строку, я получаю эту ошибку.

...