• 締切済み

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

  • Ruby
  • 回答数1
  • ありがとう数5

みんなの回答

  • KI401
  • ベストアンサー率53% (44/82)
回答No.1

大枠は、 ・1301から9999までの銘柄について ・存在すればソースを引っ張ってくる ・ソースから正規表現で欲しい情報を抜き出す ってとこ。 何がどう分からないのか分からないのでこれ以上何とも解説のしようがない。 教えてほしいなら何を知りたいのか詳しく明確に述べることだ。 「らしい…」だとか「いまいち…」とかじゃなくてさ。 あと、規約として丸投げの質問禁止だから。

関連するQ&A

  • Ruby

    ## -*- Mode: ruby -*- ###################################################################### =begin = nth機能付き連結リストクラステスト用プログラム =end ###################################################################### require 'MyLinkedList.rb' ; n = 10 ; ##------------------------------ ## 最初のリストを作成。 # 新しくリストのインスタンスを生成 list0 = MyLinkedList::new() ; # 0からnまで順に i に入れて、繰り返す。 (1...n).each{|i| # i の自乗を先頭に挿入 list0.insertToFirst(i * i) ; } ##------------------------------ ## insertToNthのテスト puts("-" * 60) ; puts("insertToNthのテスト") ; puts("before:" + "list0=" + list0.to_s()) ; puts("insert 'foo' into 5th.") ; list0.insertToNth(5,'foo') ; puts("after :" + "list0=" + list0.to_s()) ; puts("insert 'bar' into 0th.") ; list0.insertToNth(0,'bar') ; puts("after :" + "list0=" + list0.to_s()) ; puts("insert 'baz' into 10th.") ; list0.insertToNth(10,'baz') ; puts("after :" + "list0=" + list0.to_s()) ; ##------------------------------ ## deleteFromNthのテスト puts("-" * 60) ; puts("deleteFromNthのテスト") ; puts("before:" + "list0=" + list0.to_s()) ; puts("delete 5th.") ; deletedItem = list0.deleteFromNth(5) ; puts("after :" + "list0=" + list0.to_s()) ; puts("deleted Item=" + deletedItem.to_s()) ; puts("delete 0th.") ; deletedItem = list0.deleteFromNth(0) ; puts("after :" + "list0=" + list0.to_s()) ; puts("deleted Item=" + deletedItem.to_s()) ; puts("delete 10th.") ; deletedItem = list0.deleteFromNth(10) ; puts("after :" + "list0=" + list0.to_s()) ; puts("deleted Item=" + deletedItem.to_s()) ; の意味がわかる方、教えてください

  • 【Ruby】マルチスレッドでなくマルチプロセスで

    以下の様なプログラムをマルチスレッドでなくマルチプロセスで実現したいです。 #!/usr/bin/ruby require 'thread' q=Queue.new data=%w(a * * * b * * c * * d * *) data.each do |d| q.push d end (1..4).each do |n| Thread.start { while 1 do d=q.shift break if d!='*' end puts n.to_s+' '+d.to_s }.join end rubyのバーションは ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin10.0] です。バージョンをあげる事は、できれば避けたいです。 実際には上記プログラムの【puts n.to_s+' '+d.to_s】してる所は、ネットに繋いで云々の時間のかかる処理なのですが、まったくパラレルに行なっている様子が無いので、マルチプロセス化したら早くなるかなと思いました。 子プロセスを生成して親プロセスとはパイプで繋いで、、などとするのかなあと試行錯誤したのですが、どうもうまくできません。 ご指導の程、よろしくお願い申し上げます。

    • ベストアンサー
    • Ruby
  • ruby のプログラムについての質問です。

    ruby初心者です。作成したプログラムについて質問です。 某サイトの<td>セクター部分のデータを取得するプログラムを作ろうとしています。このプログラムのソースをあげときます。 # encoding: utf-8 require 'rubygems' require 'open-uri' require 'nokogiri' doc = Nokogiri::HTML(open("http://creofuga.net/"),nil,"utf-8") doc.css("td").each do |td| open("foo.txt", "w") do |f| f.write td.text end end このプログラムだと、最初のからデータを取得していくのですが、textファイルに書き込む際、1行目で得たデータを上書きをし、最終的に、サイトの最後の出たのみ出力する形となります。これをデータごとに改行しすべてのデータを出力するにはどのようにプログラムを変更すれば、よいかおしえてください。おねがいします。ちなみに最後に画像で取得したtextファイルのデータを上げときます。よろしくお願いします。

  • Ruby の 文法に困ってます。

    以下のようなソースの場合、to_sメソッドは何時呼ばれているのでしょうか。またどういう意味を成しているのでしょうか。 Ruby初心者のためご教授頂けないでしょうか。 よろしくお願いします。 class Vector   attr_accessor :x, :y   def initialize(x=0, y=0)     @x = x     @y = y   end   def length     Math::sqrt(@x ** 2 + @y ** 2)   end   def to_s      "(#{@x},#{@y})"   end   def <=> other     length <=> other.length   end end arr =[] arr << Vector.new(2,2) arr << Vector.new(3,2) arr << Vector.new arr.sort.each do |item|   puts item end 結果は以下になります。 (0,0) (2,2) (3,2)

    • ベストアンサー
    • Ruby
  • Ruby RSSの文字置換について

    RubyでRSSリーダーを作成しているのですが、 読み込んだRSSのエンコード(utf-8)とプログラムのエンコード(cp932)が異なるため、 エラーが発生しました。 <プログラム> ------------------------------------------------------- # encoding: cp932 require 'open-uri' require 'rss' xml = nil open("http://codezine.jp/rss/new/20/index.xml") { |http|    xml = http.read } rss = RSS::Parser.parse(xml.force_encoding("utf-8")) puts "#{rss.channel.title.encode('cp932', 'utf-8')}"\ + "#{rss.channel.pubDate.strftime("%Y/%m/%d %X")}" rss.items.each do |item|    puts '--------------------------'    puts item.title.encode('cp932', 'utf-8')    puts item.pubDate.strftime("%Y/%m/%d %X")    puts item.description.encode('cp932', 'utf-8') end ------------------------------------------------------ <エラーメッセージ> ------------------------------------------------------ rss_r.rb:18:in `encode': U+2013 from UTF-8 to Windows-31J (Encoding::UndefinedConversionError) ------------------------------------------------------ 以下のサイトを参考にして文字を置換しようと思ったのですが、 http://qiita.com/yugo-yamamoto/items/0c12488447cb8c2fc018 rssはStringクラスではないため、trメソッドが使えません。 どのようにすれば文字を置換できるのか教えていただけますでしょうか。

    • ベストアンサー
    • Ruby
  • Ruby

    class CDPlayer def playDisk(disk) puts "playing a "+disk+".\n"; end end class CDRadioCaset < CDPlayer def playRadio(channel) puts "playing a"+channel+"\n"; end def playCaset(tape) puts "playing a "+tape+"\n"; end end class DVDRPlayer < CDPlayer def playDisk(disk) puts "playing a"+disk+"\n" end def recoredDisk(disk) puts "recording to a "+ disk+". \n" end end cd=CDPlayer.new puts "CDPlayer. \n" cd.playDisk("CD") radio=CDRadioCaset.new puts "\n CDRadioCaset. \n" radio.playRadio("Radio") radio.playCaset("Caset") dvd=DVDRPlayer.new puts "\n DVDRPlayer.\n" dvd.playDisk(" CD or DVD") dvd.recoredDisk("disk") の意味わかる方、教えてください

  • ヒープの質問です(難易度高)

    ランダムな数15個(=1+2+4+8個)を 二分ヒープに並べ替える次のようなプログラムを作りました。 require 'HeapByArray.rb' array=Array.new(); i=0; puts("Before") while(i<15) i+=1; array[i]=rand(100); print(" "+array[i].to_s) end puts(" "); queue=HeapByArray::new i=0; while(i<15) i+=1; queue.enqueue(array[i]); end puts("After") i=0; while(i<15) i+=1; array[i]=queue.dequeue(); print(" "+array[i].to_s); end puts(); たとえばデータが [1,11,14,9,5,2,15,7,6,4,12,10,8,3,13]ならば [15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]といった風に 並べ替えられます。実行結果は Before 1,11,14,9,5,2,15,7,6,4,12,10,8,3,13 After 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 となります。 そこでこの実行結果表示をツリーの表示、つまり □□□8 □□12 □□□7 □14 □□□6 □□11 □□□5 15 □□□4 □□10 □□□3 □13 □□□2 □□9 □□□1 (□部分は空白です。ここで質問記事を投稿するときになぜか空白は無視されてしまうので□にしました。) という風になるように改良したいのですが何をすればよいでしょうか? 詳しい方、よろしくお願いいたします。

    • ベストアンサー
    • Ruby
  • 【ruby】無名関数?でブロック付きメソッドって作れませんか?

    Proc.new do|arg|  arg.each do |x|   puts x  end end.call([1,2,3,4,5]) 上記のようなものを無名関数と理解しているのですが、 これを下記の様にすると、 Proc.new {|arg|  arg.each do |x|   yield(x)  end }.call([1,2,3,4,5]) do |x|  puts x end no block given とエラーになってしまいます。 無名関数で、ブロック付きメソッドって作れないものでしょうか? ご指導の程、宜しくお願いいたします。

    • ベストアンサー
    • Ruby
  • ruby テキストファイル書き出しでの文字化け

    ruby&mac&文字の扱い 初心者です。 mac os 10.6.8 HTMLの情報を読み込みテキストファイルに書き出したいのですが、 ターミナル上、putsではきちんと日本語で表示されるのですが、書き出したあとの txtファイルを開くと文字化けしています。 File.open("test.txt","w") do |file| @s_info.each do |data| puts data[:m_sec] file.puts data[:m_sec] end end よろしくお願いします。

    • ベストアンサー
    • Ruby
  • Ruby WEBrick cgiからgifが最後まで送れない。

    以下のようなHTTPサーバをWinXp上で動かしました。 #$ruby = "C:/ruby/bin/ruby.exe" require 'webrick' srv = WEBrick::HTTPServer.new({ :BindAddress => 'xxx.xxx.xxx.xxx', :CGIInterpreter => "c:/ruby/bin/ruby.exe", :Port => 80 }) srv.mount("/", WEBrick::HTTPServlet::FileHandler, "./", {:FancyIndexing=>true}) srv.start そして、以下のようなCGIをよびます。 #!/usr/bin/ruby STDOUT.binmode open("hoge.gif", "r") do |f| f.binmode body = f.read puts "content-type: image/gif" puts "content-length: #{body.size.to_s}" puts "" print body end すると、content-length分のHTTPボディーが送られてきません。 2種類のgifで試しましたが、193byte/724byte、289byte/451byteでした。 バージョンは、ruby 1.8.6、WEBrick 1.3.1です。 何が原因でしょうか?