perl - Parse::CSV,解析没有标题的文件
问题描述
我得到的数据是来自 mysql 数据库的转储,其中一些文件缺少列标题。
当我尝试获取一行时,说 Dumper $parser->fetch; 在没有列标题的文件上返回未定义。我已经完成了 if (-e $file) 并且它看到了该文件。我也试过
名称 => 1
和
名称 => ['id', '描述']
并且两次输出都是 undef,尽管对于后者 $parser->names 确实输出了id和描述(名称,而不是列值)。
我是否正确分配了列名?如果是这样,为什么它返回未定义?
#!/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 "
解决方案
您的构造函数指定quote_char => "'"
而您的示例数据文件使用双引号"
如果您在 CSV 数据中没有标题,那么您应该使用names => 0
让模块返回数据数组,而不是由列名键入的哈希值
我还建议您open
明确文件并检查它是否成功。然后您可以在参数中传递您所知道的有效文件句柄file
而不是路径字符串
推荐阅读
- python - 已解决:异步 websockets while 循环逻辑
- mongodb - Mongorestore 4.2 可以与 AWS DocumentDB 4.0 一起使用吗?
- swift - SpriteKit 更新节点位置导致动画故障
- amazon-web-services - 使用 SNS 发送推送通知,但在 Android 设备上未收到通知
- c# - 为什么更改内容后我的xml相同?
- javascript - 成员函数如何访问您的对象?
- ibm-watson - 有没有办法重命名 IBM Watson 意图?
- python - python web-crawling,requests.post在服务器环境中不返回任何内容
- php - 操作字符串以将其转换为具有不同格式的另一个字符串
- matlab - 为什么在 kfoldPredict 的分数中找到 NaN 值?