我正在尝试解析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次编辑:不知道是谁编辑了我的帖子和主题问题,但这根本不是!
答案 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文档。