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 に対して一度に 1 行を生成する例を次に示します。これにより、行の開始点または終了点を気にする必要がなくなると思います。

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 に答える