使用ARGF时是否没有行尾字符?

时间:2013-05-02 00:01:07

标签: ruby regex

我有一个格式如下的csv文件:

Wed Mar 07 00:00:00 CET 2012,78.0
Thu Mar 08 00:00:00 CET 2012,46.0
...

我使用标准输入读取它,并尝试使用以下方法匹配每行的部分:

ARGF.each_line do |line|
    time << line.scan(/^\w{3} (\w{3}) (\d{2}) (\d{2}:\d{2}:\d{2}) \w+ (\d{4}),([.\d]+)$/)
end

由于某种原因,它只返回文件中的最后一行。

如果我将CSV文件复制到字符串变量,它会开始正确匹配每一行。如果我从正则表达式中删除美元符号,它也会正确匹配,但我不明白为什么$在从ARGF读取时不起作用。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您是否有必要使用ARGF?您可以查看CSV class in the standard library,它提供了一些工具,使处理更加轻松。

这是一个一次产生一行的例子。我猜这可以让你不用担心行开始或结束的位置:

require "csv"

CSV.foreach("path/to/file.csv") do |row|
  time << line.scan(/^\w{3} (\w{3}) (\d{2}) (\d{2}:\d{2}:\d{2}) \w+ (\d{4}),([.\d]+)$/)
end