我有一个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读取时$
不能工作。有什么想法吗?
发布于 2013-05-02 00:35:08
你必须使用ARGF有什么原因吗?您可以查看CSV class in the standard library,它提供了一些工具来简化处理。
下面是一个对foreach一次生成一行的示例。我猜这使您不必担心行的开始和结束位置:
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
https://stackoverflow.com/questions/16328336
复制