【发布时间】:2018-10-10 18:56:47
【问题描述】:
我得到的数据是来自 mysql 数据库的转储,其中一些文件缺少列标题。
当我尝试获取一行时,说 Dumper $parser->fetch; 在没有列标题的文件上返回 undefined。我已经完成了 if (-e $file) 并且它看到了该文件。我也试过了
名字 => 1
和
names => ['id', 'description']
两次输出都是 undef,尽管对于后者 $parser->names 确实输出了 id 和 description(名称,而不是列值)。
我是否正确分配了列名?如果是,为什么返回 undefined?
#!/usr/bin/perl
use v5.24.3;
use strict;
use warnings;
# Modules
use Data::Dump; # dd \%hash
use Data::Dumper; # say Dumper(\%hash)
use Spreadsheet::ParseXLSX;
use Text::CSV_XS;
use Parse::CSV;
my $path = './path/to/data/';
my $vendor = 'fwd';
my $ext = '.csv';
my @f = (
'spring_categories',
'prod_descriptions',
'feature_bullets',
'category_mapping'
);
my $file = $path . $vendor . '/' . $f[1] . $ext;
my $parser = Parse::CSV->new(
"file" => $file,
"names" => ['id', 'description'],
"csv_attr" => {
"sep_char" => ',',
"quote_char" => "'"
}
);
# Not triggering error
if ( $parser->errstr )
{
say "There was an error";
}
else
{
say $parser->names; # outputs | iddescription
say Dumper $parser->fetch; # outputs | $VAR1 = undef
# Doesn't reach while
while ( my $value = $parser->fetch )
{
say Dumper $value;
say $parser->row;
# my @names = $parser->names;
# dd \@names;
# say $names[0];
die;
}
这是我在没有机密数据的情况下共享的临时测试文件,对我来说也有同样的问题。
4732947234,"Lorem ipsum dolor sit amet, consectetur adipiscing elit"
6732947274,"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo"
7657657274,Nemo enim ipsam voluptatem quia voluptas
3993007274,magnam aliquam quaerat voluptatem
2449049474,"laboriosam, nisi ut aliquid ex ea commodi consequatur"
4732947273,"laboriosam, nisi ut aliquid ex ea commodi consequatur"
8732947270,"ntium doloremque laudantium, totam rem aperiam, eaque ipsa "
【问题讨论】:
-
你有文件吗?
-
@Andrey 我无法共享我正在使用的数据,但要重现只是创建一个包含 2 列的 CSV,第一列是序列号,第二列是简短描述(我使用了 lorem ipsum)。我用随机的 10 位数字和 lorem ipsum 创建了一个简短的 7 行 csv 文件,它仍然得到相同的结果。
-
您是否有文件丢失标题或所有文件的问题?
-
@Andrey 只是缺少标题的文件。我为我制作的测试 csv 文件创建了一个临时下载链接。 expirebox.com/download/eb9bf54d625a5ac6c2832972359b107a.html
-
@Andrey 我复制了该测试文件并添加了标题,但它仍然返回未定义。我还从工作文件中复制了标题和前 7 行并将它们粘贴进去,但它也不起作用。