为什么我使用Text :: CSV收到错误消息»无法解析行«?

时间:2011-05-10 07:54:48

标签: perl csv

我正在尝试解析Perl中的CSV文件,但是我并不真正理解我在Internet上找到的示例。有人能解释一下这个例子吗?

#!/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是主机名,我想按字段#2解析字段#3(MAC地址)。


编辑n°2

实际上,不需要为我的目的解析CSV文件。我找到了一个bash解决方案,速度足以满足我的应用。

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

完成!
谢谢你的帮助,有一天我必须解析一个csv文件,确定。

第3次编辑:不知道是谁编辑了我的帖子和主题问题,但这根本不是!

5 个答案:

答案 0 :(得分:5)

$.是输入行号。 $_是许多Perl运算符(包括<>)处理的“神奇”默认变量,除非另有说明。

perldoc perlvar中查找详细信息。

顺便说一句,如果你将$.填入错误信息,你至少知道哪一行失败了。

编辑:我将error_input替换为error_diag,现在说:2037EIF - Binary character in unquoted field, binary off106。添加my $csv = Text::CSV->new ({binary=>1});后,解析的行就OK了。

所以看起来重音字符混淆了Text :: CSV。

答案 1 :(得分:3)

这些天好的做法是使脚本符合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 :(得分:2)

您可以尝试使用$ csv-&gt; error_diag方法找出模块对您的输入不喜欢的内容。

然后你可以启用二进制数据处理以使其正常工作。但我强烈怀疑你应该改为Text::CSV::Encoded

答案 3 :(得分:0)

我不同意有关使用您自己的CSV解析器的人。 相反,我的建议是使用更简单的CSV解析器,如Parse::CSV。这是一个易于使用的模块。文档中的第一个示例应该足以让您轻松开始。

答案 4 :(得分:0)

以二进制模式打开CSV文件总是好的:

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

可能是您的CSV文件是以UTF8或任何其他字符集编码的。有关详细信息,请阅读Text::CSV文档。