2009年 05月14日(Thu) [長年日記]
_ [TCG][Chaos][プログラム][ruby]ChaosTCGのエクセル版カードリストを作ろう(その3)
カードデータが取得できれば、後は加工してエクセルで出力するだけです。エクセルへの出力は、以前D-0のデッキ構築支援ツールでデッキシートに出力するプラグインを作った時にやったことがあります。……どう実装したのか全然覚えていませんが(^^;
仕方ないのでぐぐる先生に聞いてみたりしつつ、作り上げたのが以下のスクリプト。UTF-8で書いてあるつもりで見てください。カードセットの最初のカードNo.(NP-001とか)をコマンドライン引数として渡してやると、そのカードセット全体をまとめてひとつのエクセルファイルとして出力します。
- get_chaos_cardlist.rb
require 'rubygems' require 'mechanize' agent = WWW::Mechanize.new os, no = /(\w+-)(\d+)/.match(ARGV[0]).to_a.values_ at(1,2) list = [] until agent.get("http://chaos-tcg.com/jsp/cardlist ?cardno=#{os}#{no}").search('table.status').empty? agent.page.links_with(:href=>/cardno/).map{|link| sleep 0.1 card_page = link.click sleep 0.1 no = /cardno=\w+-(\d+)/.match(card_page.uri.to _s).to_a[1] array = [] card = {} (card_page/'table.status td').map{|e| array << e.inner_html} name, kana = /(.+)<br><span class=\"kana\">(.+ )<\/span>/.match(array[1]).to_a.values_at(1,2) card[:name] = name card[:kana] = kana card[:num] = array[2] card[:sex] = array[3] card[:rarity] = array[4] card[:type] = array[5] card[:attribute] = array[6] card[:attack] = array[7] card[:defense] = array[8] card[:attack_diff] = array[9] card[:defense_diff] = array[10] card[:text] = array[11].gsub(/<br>/, "\n") card[:flavor] = array[12].gsub(/<br>/, "\n") card[:expansion] = array[13] card[:entry] = array[14].gsub(/<br>/, "\n") puts card[:num] list << card } no = sprintf('%03d', no.to_i + 1) end require 'win32ole' require 'kconv' def getAbsolutePath filename fso = WIN32OLE.new('Scripting.FileSystemObject') return fso.GetAbsolutePathName(filename) end module WorkSheet def []=(y, x, value) cell = self.Cells.Item y,x if cell.MergeCells cell.MergeArea.Item(1,1).Value = value else cell.Value = value end end end xl = WIN32OLE.new('Excel.Application') #xl.Visible = true book = xl.Workbooks.Add sheet = book.Worksheets.Item 1 sheet.extend WorkSheet head = [ "カードNo.", "カード名", "カナ", "種類", "性別", "属性", "レアリティ", "攻撃力", "攻撃力(補正)", "耐久力", "耐久力(補正)", "効果テキスト", "フレーバー", "エキスパンション", "参加作品" ] head.each_index{|i| sheet[2, i + 2] = head[i].kconv(Kconv::SJIS, Kco nv::UTF8) } y = 4 list.each{|card| sheet[y, 2] = card[:num] sheet[y, 3] = card[:name].kconv(Kconv::SJIS, Kco nv::UTF8) sheet[y, 4] = card[:kana].kconv(Kconv::SJIS, Kco nv::UTF8) sheet[y, 5] = card[:type] sheet[y, 6] = card[:sex].kconv(Kconv::SJIS, Kcon v::UTF8) sheet[y, 7] = card[:attribute].kconv(Kconv::SJIS , Kconv::UTF8) sheet[y, 8] = card[:rarity] sheet[y, 9] = card[:attack] sheet[y, 10] = "'#{card[:attack_diff]}" sheet[y, 11] = card[:defense] sheet[y, 12] = "'#{card[:defense_diff]}" sheet[y, 13] = card[:text].kconv(Kconv::SJIS, K conv::UTF8) sheet[y, 14] = card[:flavor].kconv(Kconv::SJIS, Kconv::UTF8) sheet[y, 15] = card[:expansion].kconv(Kconv::SJ IS, Kconv::UTF8) sheet[y, 16] = card[:entry].kconv(Kconv::SJIS, Kconv::UTF8) y += 1 } filename = getAbsolutePath("#{list[0][:expansion]. kconv(Kconv::SJIS, Kconv::UTF8).gsub(/[:\.]/, '_')}. xls") book.SaveAs(filename) book.Close xl.Quit
横幅が収まらないので適当に改行しています。
とりあえずこれでエクセルのカードリストは生成できました。一応サンプルとして以下にファイルをアップしておきます。
罫線の追加とかセルのリサイズは気になる人が各自適当にやってください。
(追記)軽く出来上がったものを見ると少しへんな所が残ってる模様。さてどうするか。