[英]Loading PDL matrix from tsv file with header does not work as expected
我有一個帶有列名的 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]
]
我將標題值更改為“自動”,它應該跳過所有列中具有非數字值的行:
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 設置為帶有header => 1的第一行而得到錯誤的結果?
這似乎是一個在 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]
]
(請注意, rcsv2D
不支持header=>'auto'
,並且在發出您報告的警告后被視為header=>0
。)
我發現我有一個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
編輯:我獨立找到了一個解決方案,但池上的答案更有用,因為它解釋了header => 'auto'
行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.