Загрузка матрицы PDL из файла tsv с заголовком не работает должным образом - PullRequest
1 голос
/ 20 января 2020

У меня есть файл tsv foo.tsv с именами столбцов: "a", "b", "c", "d". Я хочу прочитать этот файл и загрузить его содержимое в матрицу PDL. Файл foo.tsv выглядит следующим образом:

a   b   c   d
1   6   7   4
2   7   6   10
3   8   5   6
4   9   4   8
5   10  3   7

Я использовал этот код, чтобы прочитать файл в матрицу и распечатать его:

use PDL::Core qw(pdl);
use PDL::IO::CSV ':all';

# Header set to the first row following https://github.com/kmx/pdl-io-csv
# Sep_char set to the tab
my $data = rcsv2D('foo.tsv', {text2bad => 1, header => 1, sep_char => "\t"});

print $data;

Печатная матрица неверна, поскольку в ней отсутствует первая строка с номерами после заголовка:

[
 [ 2  3  4  5]
 [ 7  8  9 10]
 [ 6  5  4  3]
 [10  6  8  7]
]

Я изменил значение заголовка на 'auto', которое должно пропускать строки, имеющие во всех столбцах ненулевые значения c:

my $data = rcsv2D('foo.tsv', {text2bad => 1, header => 'auto', sep_char => "\t"});

Теперь я получаю предупреждение, но матрица выглядит нормально:

Argument "auto" isn't numeric in foreach loop entry at C:/sw/pdl/perl/vendor/lib/PDL/IO/CSV.pm line 335, <DATA> line 207.
[
 [ 1  2  3  4  5]
 [ 6  7  8  9 10]
 [ 7  6  5  4  3]
 [ 4 10  6  8  7]
]

Я не понимаю, почему результирующие матрицы отличаются и почему я получаю неправильный результат, устанавливая заголовок для первой строки с header => 1 ?

Ответы [ 2 ]

2 голосов
/ 20 января 2020

Кажется, это ошибка, исправленная в 0,011.

0.011   2019/12/04
        - fix: header option eats extra line #2
        - fix: cpantesters failure on long-double perls

С 0,011 ваш код работает нормально.

use strict;
use warnings;

use PDL::IO::CSV ':all';

my $data = rcsv2D('foo.tsv', {text2bad => 1, header => 1, sep_char => "\t"});
print $data;
$ perl -e'
   CORE::say join "\t", @$_
      for
         [qw( a  b  c  d  )],
         #    -- -- -- --
         [qw(  1  6  7  4 )],
         [qw(  2  7  6 10 )],
         [qw(  3  8  5  6 )],
         [qw(  4  9  4  8 )],
         [qw(  5 10  3  7 )];
' >foo.tsv

$ perl a.pl

[
 [ 1  2  3  4  5]
 [ 6  7  8  9 10]
 [ 7  6  5  4  3]
 [ 4 10  6  8  7]
]

(Обратите внимание, что header=>'auto' rcsv2D не поддерживается и обрабатывается как header=>0 после выдачи предупреждения, о котором вы сообщили.)

1 голос
/ 20 января 2020

Я узнал, что у меня есть версия 0.010 из PDL::IO::CSV. Из файла Changes кажется, что в этой версии есть ошибка, поскольку заголовок съедает лишнюю строку. Это было исправлено в версии 0.011:

0.011   2019/12/04
        - fix: header option eats extra line #2
        - fix: cpantesters failure on long-double perls

РЕДАКТИРОВАТЬ: Я нашел решение самостоятельно, но ответ ikegami более полезен, поскольку он объясняет поведение header => 'auto'.

...