👾
ポケモンの種族値を秒速で確認するCLIツールを作ってみる
https://yakkun.com/swsh/stats_list.htm
をスクレイピングして、SQLに変換する
pokemon.rb
を書いてみます。
スクレイピングにはnokogiriを使ってみました。またローマ字を扱うのでromajiも便利でした。
こうやって
curl https://yakkun.com/swsh/stats_list.htm | ruby pokemon.rb | sqlite3 pokemon
としていつでも作り直せるようにしておくと、あとあと便利です。(アプデでポケモンが増えたりするので……。)
#! /usr/bin/env ruby
# curl https://yakkun.com/swsh/stats_list.htm | ruby pokemon.rb | sqlite3 pokemon
require 'nokogiri'
require 'romaji'
Encoding.default_external='euc-jp'
html = $stdin.read
doc = Nokogiri::HTML(html)
doc.css('.stupidtable > tbody > tr > td').each_slice(9) do |line|
no, jpname, h, a, b, c, d, s, sum = line.map { |td| td.children.first.text }
jpromaji = Romaji.kana2romaji(jpname)
values = [
no.to_i,
"\"#{jpname}\"",
"\"#{jpromaji}\"",
h.to_i,
a.to_i,
b.to_i,
c.to_i,
d.to_i,
s.to_i,
sum.to_i,
puts "insert into status_list (no, jpname, jpromaji, h, a, b, c, d, s, sum) values (#{values.join(',')}) on conflict(jpromaji) do nothing;"
こちらの記事がわかりやすくてありがたかったです。
スクリプトはいくらでも凝れそうですが、表示の仕方を変えれるオプションを付けるぐらいにとどめています。
#! /usr/bin/env ruby
require 'io/console'
require 'open3'
sqlite_argument = ARGV[0] || '-list'
class Cursor
def move_top
print "\e[0H"
def line_on(i)
print "\e[#{i}G"
def clear_line
line_on(0)
print "\e[2K"
def clear_after
print "\e[0J"
def clear_all
print "\e[2J"
cursor = Cursor.new
columns = "jpname,jpromaji,h,a,b,c,d,s"
query_template = "select #{columns} from status_list where jpromaji LIKE \"%%%s%%\" limit 10"
cursor.clear_all
buff = []
$stdin.raw do |stdin|
while true
cursor.move_top
cursor.clear_line
print "> #{buff.join}"
case c = stdin.getc
when "\r", "\n"
buff.clear
cursor.clear_after
when "\u007F"
# backspace
buff.pop
when "\u0003", "\u0004"
# CTRL+C or CTRL+D
exit 0
buff << c
query = sprintf(query_template, buff.join)
## debug
# cursor.clear_line
# puts query
cursor.clear_line
puts columns
out, _status = Open3.capture2e("sqlite3 #{sqlite_argument} pokemon", stdin_data: query)
out.each_line do |line|
cursor.clear_line
puts line
cursor.clear_after