我有一个格式如下的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读取时不起作用。有什么想法吗?
答案 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