Почему я получаю сообщение об ошибке »Не удалось проанализировать строку« с Text :: CSV? - PullRequest
1 голос
/ 10 мая 2011

Я пытаюсь проанализировать файл CSV в Perl, но не совсем понимаю примеры, которые я нашел в Интернете.Может ли кто-нибудь объяснить мне этот пример?

#!/usr/bin/perl
use strict;
use warnings;
use Text::CSV;

my $file = 'dhcp.csv';

my $csv = Text::CSV->new();

open (CSV, "<", $file) or die $!;

while (<CSV>) {
    next if ($. == 1);
    if ($csv->parse($_)) {
        my @columns = $csv->fields();
        print "Name: $columns[0]\n\tContact: $columns[4]\n";
    } else {
        my $err = $csv->error_input;
        print "Failed to parse line: $err";
    }
}
close CSV;

Когда я запускаю его, я получаю Failed to parse line.Что означает $.$_?

Моя цель - найти строку, где находится имя компьютера, которое я ищу.После этого я могу найти соответствующий MAC-адрес.Я надеюсь, что это понятно, спасибо.


РЕДАКТИРОВАТЬ :

Мой CSV-файл выглядит так:

172.30.72.22,DEC-16.rec.local,001676b755d6,Bart SIMPSONS,Ordinateur de bureau,DEC/DECVA,002,SR2 0.12,,Accès complet,N/D,Aucun
172.30.72.23,DEC-20.rec.local,001688b7bfdc,Larry Wall,Ordinateur de bureau,DEC/DECVA,003,?,,Accès complet,N/D,Aucun

Поле № 2имя хоста, я хочу разрешить поле № 3 (MAC-адрес) в поле № 2.


РЕДАКТИРОВАТЬ n ° 2 :

На самом деле, неМне нужно разобрать файл CSV для моей цели.Я нашел решение для bash, достаточно быстрое для моего приложения.

my $macAdd = `cat dhcp.csv | grep {computerName} | cut -d ',' -f 5`

Готово!
Спасибо за вашу помощь, однажды мне придется проанализировать CSV-файл, конечно.

3-е редактирование: не знаю, кто редактировал мой пост и тему вопроса, но это совсем не так!

Ответы [ 5 ]

5 голосов
/ 10 мая 2011

$. - номер строки ввода.$_ - это «магическая» переменная по умолчанию, на которую действуют многие операторы Perl (включая <>), если не указано иное.

Подробности смотрите в perldoc perlvar .

Кстати, если вы введете $. в сообщение об ошибке, вы по крайней мере узнаете, какая строка не работает.

РЕДАКТИРОВАТЬ: я заменил error_input на error_diag и теперь он говорит: 2037EIF - Binary character in unquoted field, binary off106.После добавления my $csv = Text::CSV->new ({binary=>1}); строки разобрались ОК.

Похоже, что символы с акцентом сбиты с толку. Text :: CSV.

3 голосов
/ 10 мая 2011

В настоящее время хорошей практикой является совместимость сценария UTF-8, поэтому:

use strict;
use warnings;
use Carp;
#use utf8; #uncomment, if in this script want use utf8 characters
use Text::CSV;

my $csv = Text::CSV->new();

my $file = 'dhcp.csv';
open(my $fh, "<:encoding(UTF-8)", $file) || croak "can't open $file: $!";
while (<$fh>) {
    #next if ($. == 1); #uncomment, if your data file has header line too
    if ($csv->parse($_)) {
        my @columns = $csv->fields();
        print "Name: $columns[0]\n\tContact: $columns[4]\n";
    } else {
        my $err = $csv->error_input;
        print "Failed to parse line: $err";
    }
}
close $fh;
2 голосов
/ 10 мая 2011

Вы можете попробовать использовать метод $ csv-> error_diag, чтобы узнать, что модулю не нравится в вашем вводе.

И тогда вы можете включить обработку двоичных данных, чтобы она заработала. Но я сильно подозреваю, что вместо этого вы должны смотреть Text :: CSV :: Encoded .

0 голосов
/ 10 мая 2011

Всегда полезно открывать файлы CSV в двоичном режиме:

my $csv = Text::CSV->new({ binary => 1});

Может быть, ваш CSV-файл закодирован в UTF8 или любой другой кодировке. Прочитайте Text :: CSV документацию для получения дополнительной информации.

0 голосов
/ 10 мая 2011

Я не согласен с людьми по поводу использования вашего собственного парсера CSV.Вместо этого я предлагаю использовать более простой анализатор CSV, например Parse :: CSV .Это простой в использовании модуль.Самого первого примера в документации должно быть достаточно, чтобы начать безболезненно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...