添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Zenn
👾

ポケモンの種族値を秒速で確認するCLIツールを作ってみる

2020/09/25 に公開

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