0

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

4

1 回答 1

0

您是否有理由必须使用 ARGF?您可以查看标准库中的 CSV 类,它提供了使处理更容易的工具。

这是一个示例,它一次产生一行以进行 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
于 2013-05-02T00:35:07.983 回答