Parse :: CSV, синтаксический анализ файла без заголовков - PullRequest
0 голосов
/ 30 апреля 2018

Данные, которые мне предоставили, являются дампом из базы данных mysql, и в некоторых файлах отсутствуют заголовки столбцов.

Когда я пытаюсь извлечь строку, скажем, Dumper $ parser-> fetch; возвращает неопределенное значение для файлов без заголовков столбцов. Я сделал if (-e $ file), и он видит файл. Я также попробовал

names => 1

и

names => ['id', 'description']

и оба раза вывод был неопределенным, хотя для последних имен $ parser-> он вывел 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 "

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Ваш конструктор задает quote_char => "'", тогда как ваш файл данных примера использует двойные кавычки "

Если у вас нет заголовков в данных CSV, тогда вы должны использовать names => 0, чтобы модуль возвращал массивы данных, а не хэши с ключом имени столбца

Я также предлагаю вам open файл явным образом и проверить его успешность. Затем вы можете передать то, что вы знаете, является допустимым дескриптором файла в параметре file вместо строки пути

0 голосов
/ 30 апреля 2018

Приведенный ниже код анализирует файл test.csv, который вы отправили:

use strict;
use warnings;
use Text::CSV_XS;
my $csv = Text::CSV_XS->new ({ binary => 1, auto_diag => 1, sep_char => ',', allow_whitespace => 1, allow_loose_quotes => 1});
open my $fh, "<", 'test.csv' or die "Unable to open test.csv: $!";
while (my $row = $csv->getline ($fh)) {
    foreach my $filed (@$row) {
        print "[$filed]";
    }
    print "\n";
}
close $fh;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...