【问题标题】:Perl 5.12.3 fails to loop CSV file line by linePerl 5.12.3 无法逐行循环 CSV 文件
【发布时间】:2014-02-15 10:59:40
【问题描述】:

我相信有人对以下脚本发生的事情有解释:

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

关于 .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 $!;

【问题讨论】:

  • 在windows换行符是两个字符\r\n
  • @n0rd 和 chomp 只删除其中一个。对于 Windows,我使用 s/[\r\n]*$//
  • chomp 删除指定为换行符的任何内容($/ 变量)。默认情况下,在 OS X 上,我猜它设置为不同于 \r\n

标签: perl csv


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    perldoc -f binmodeperldoc -f open

    open(INFO, '&lt;:crlf', './expensereport.csv') ...

    【讨论】:

      【解决方案3】:

      啊,这很清楚! :)

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

      改用print "$line\n";

      【讨论】:

      • 即使进行了更正,它仍然会打印报告的最后一行。
      • 我刚刚检查了一个简单的 .CSV,它确实有效。很可能您的 CSV 有其他的,嗯,特殊性。哦!您的文件是否实际上包含 '\n' ?尝试hexdump -C expensereport.csv 并寻找0a(通常在0d 之后)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      相关资源
      最近更新 更多