Rubyの株価ダウンロードプログラム
以下は、Yhooファイナンスからの株価ダウンロードプログラムらしいのですが、私にはどういったことをしているのか、いまいちわかりません。
どなたか解説していただけませんか。
require 'open-uri'
require 'nkf'
require 'jcode'
require 'date'
$KCODE='s' # 漢字コードをEUCに。Windowsでは 's'
#****シフトJISに変換****
class String
def to_sjis
henkan = NKF.nkf('-s', self)
henkan
end
end
#***************
today = Date::today
regEx = '(\d+)年(\d+)月(\d+)日<\/small><\/td><td><small>([\d,]+)<\/small><\/td><td><small>([\d,]+)<\/small><\/td><td><small>([\d,]+)<\/small><\/td><td><small><b>([\d,]+)<\/b><\/small><\/td><td><small>([\d,]+)<\/small><\/td><td><small>([\d,]+)'
1301.upto(9999) do |meigara|
begin
begin
meigaradatafile = open("#{meigara}.csv" , "r" )
rescue
puts "#{meigara}" + 'は存在しません'
meigaradatafile = open("#{meigara}.csv" , "w" )
meigaradatafile.close
meigaradatafile = open("#{meigara}.csv" , "r" )
end
meigaradata = meigaradatafile.readlines
if meigaradata == []
lastdate = Date::new(1983 , 1 , 4)
else
meigaradatalastline = meigaradata[meigaradata.length-1].split(/\s*,\s*/)
lastyear = meigaradatalastline[0]
lastmonth = meigaradatalastline[1]
lastday = meigaradatalastline[2]
meigaradatafile.close
lastdate = Date::new(lastyear.to_i , lastmonth.to_i , lastday.to_i)
if lastdate >= today
next
end
lastdate = lastdate + 1
end
starttime = Time.now
temp2 = String.new
max = today - lastdate
0.step(max , 50) do |i|
begin
f = open("http://table.yahoo.co.jp/t?s=#{meigara}.t&a=#{lastdate.month 5;&b=#{lastdate.day}&c=#{lastdate.year}&d=# 23;today.month 5;&e=#{today.day 25;&f=#{;today.year}&g=d&q=t&y=#{i}&z=#{meigara}.t&x=.csv")
rescue TimeoutError
puts 'タイムアウト リトライ'
retry
end
str = Array.new
temp = String.new
temp = f.read.to_sjis
temp3 = Array.new
temp.each_line do |line|
line = line.gsub("," , "")
if line.scan(/#{regEx}/) != []
str.push line.scan(/#{regEx}/)
end
end
p meigara.to_s + ':' + i.to_s
if str == []
break
end
str.each do |j|
temp3.push j
end
temp3.each do |k|
temp2 = k.join(",").to_s + "\n" + temp2
end
end
if
temp2 != ""
foo = open("#{meigara}.csv",'a')
foo.puts temp2
foo.close
end
elapsedtime = (Time.now - starttime)/60
yosou = elapsedtime * (9999 - meigara.to_i)
puts meigara.to_s + ' ' + '経過時間' + ':' + (elapsedtime.to_s) + '予想時間' + ':' + (yosou/60/60).to_s
rescue
retry
end
end
お礼
いつもありがとうございます。 いじくりすぎた物のエラーを提示していました。 hoge.rb:19:in `block in <main>': undefined method `try' for main:Object (No MethodError) どうやらtryが定義されていない?のようでエラーが出ます。 今更、def tryの前にCSV.foreach内で登場している為、だと思って見た所、後ろにしてみた所、上手く実行する事が出来ました。 まだrubyが理解できていないので暇が出来たら簡単なプログラムを練習して見たいと思います。 今回もありがとうございました。