Perl 5.12.3无法逐行循环CSV文件

时间:2014-02-15 01:20:23

标签: perl csv

我确信有人会解释以下脚本发生了什么:

请注意,我指定的文件可用且正在打开。我知道这是因为文件的最后一行是在程序运行时输出的,但它只是最后一行。

关于.csv文件的注意事项:它是在Windows上生成的(我使用的是OS X 10.7.4和Perl 5.12.3)并使用\r换行符。我试图告诉Perl,换行符字符是\ r在脚本的顶部,但它不起作用。我知道它们是\r,因为grep搜索在文本编辑器中找到它们。

脚本运行并仅打印文件的最后一行。如果我插入一个正则表达式,它将从第一行获取第一个匹配字段并回显它,但我不能迭代整个文件。

任何澄清都表示赞赏,因为我是perl的新手。

#!/usr/bin/perl

use warnings;

print "Please enter your filename:";


my ($dataline);
open(INFO,'./expensereport.csv') || die("can't open datafile: $!");

while (my $line = <INFO>)  {
chomp $line;
print $line;


}
print $!;

3 个答案:

答案 0 :(得分:1)

没有换行的回车导致打印覆盖同一行的每一行,所以你看到的只是最后一行。

在处理之前在输入文件上运行dos2unix。

答案 1 :(得分:1)

有几种方法可以告诉perl你的输入文件是windows风格的:crlf。

perldoc -f binmodeperldoc -f open

open(INFO, '<:crlf', './expensereport.csv') ...

答案 2 :(得分:0)

啊,这很清楚! :)

看,你有一个带\ r(回车,字面)和\ n(换行符)的文件。 chomp切断\ n(新行)。所以你一遍又一遍地打印同一行(记得“回车”)。

使用print "$line\n";代替