«前の日記(2009年 05月13日(Wed)) 最新 次の日記(2009年 05月17日(Sun))» 編集

日記のような何か

2002|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|08|09|10|11|12|
2020|01|02|03|04|06|07|08|09|10|11|12|
2021|01|02|03|04|05|07|08|10|11|12|
2022|01|02|03|04|05|06|07|08|10|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|09|10|11|

ようこそいらっしゃいました。
あなたは今日人目、合計人目のお客様です(ちなみに昨日は人のお客様がいらっしゃいました)。
よろしければツッコミに足跡等を残していって下さいな。

My status ← skypeやってます。


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

横幅が収まらないので適当に改行しています。

とりあえずこれでエクセルのカードリストは生成できました。一応サンプルとして以下にファイルをアップしておきます。

罫線の追加とかセルのリサイズは気になる人が各自適当にやってください。

(追記)軽く出来上がったものを見ると少しへんな所が残ってる模様。さてどうするか。


Googleカスタム検索

my recommend books