首页 > 解决方案 > 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 "

标签: perlcsvparsing

解决方案


您的构造函数指定quote_char => "'"而您的示例数据文件使用双引号"

如果您在 CSV 数据中没有标题,那么您应该使用names => 0让模块返回数据数组,而不是由列名键入的哈希值

我还建议您open明确文件并检查它是否成功。然后您可以在参数中传递您所知道的有效文件句柄file而不是路径字符串


推荐阅读