Mae向きなブログ

Mae向きな日記のブログ版。ようやくこちらに移行してきました。

RubyとSQLite

MacとかLinuxでは,RubySQLiteを連携させたことはあるのですが,Windowsでは試したことがありません。仕事は,Windows環境であり,データベースを扱う必要性を最近感じていますので,Windows環境で試してみました。最終ゴールは,RubySQLiteExcelをうまく連携させることです。なんでこんなことをするのかというと,

  • 以前,Accessを使ってみようと思ったことはあるのですが,難しくてマスター出来なかった。
  • VBAが書けない

からです。

手順

  1. Windows版のSQLiteのをダウンロード*1
  2. sqlite3.exe, sqlite3.dllをC:\Program Files\sqliteにおいて,PATHに追加。
  3. gem install sqlite3-ruby
  4. 日本郵便のホームページ*2から郵便番号のファイル(45MIYAZA.CSV)をダウンロードする。

insert_db.rb

郵便番号と住所のデータ(45MIYAZA.CSV)をデータベースへ登録します。

# -*- coding: cp932 -*-
require 'rubygems'
require 'sqlite3'
require 'nkf'
require 'csv'

db = SQLite3::Database.new("zipcode.db")

sqls=<<-EOS
  drop table if exists ziptable;
  create table ziptable (
    code text,
    address text
  );
EOS

db.execute_batch(sqls)

CSV.foreach("45MIYAZA.CSV") do |row| 
  code = row[2]
  address = row[6] + row[7] + row[8]
  sql = "insert into ziptable (code, address) values (\'#{code}\', \'#{NKF::nkf('-w', address)}\')"
  db.execute(sql)
  puts code + " : " + address
end
db.close

search_db.rb

宮崎県庁がある「橘通東」の郵便番号を調べてみます。

# -*- coding: cp932 -*-
require 'rubygems'
require 'sqlite3'
require 'nkf'

db = SQLite3::Database.new("zipcode.db")

search_word = NKF::nkf('-w', "橘通東")
sql = "select code, address from ziptable where address like \'%#{search_word}%\'"
db.execute(sql) do |code, address|
  code = $1 + "-" + $2 if /(\d{3})(\d{4})/ =~ code 
  puts "#{code}\t#{NKF::nkf('-s', address)}"
end
db.close

実行

> ruby insert_db.rb
> ruby search_db.rb
880-0805 宮崎県宮崎市橘通東