ダミーの住所データを作るスクリプト

お問い合わせとかのデータを作らないといけない事ってのはDB扱ってるとちょくちょくあると思うんやけど、そういう面倒なことは自動化してこそプログラマだろ!!っつーことで作ってみました。

必須ライブラリなど

  • Ruby 1.8.4 or later is installed
  • ActiveRecord 1.14.3 or later is installed
  • sqlite3-ruby 1.1.0 or later is installed
  • ruby/amazon 0.9.0 or later is installed
  • sqlite3
  • zip data

作り方

  • まずは郵便番号のデータを取ってきてUTF-8に変換。ちなみに郵政公社が公開しているもので、改変や配布は自由ってことでした。
$ wget http://www.post.japanpost.jp/zipcode/dl/kogaki/lzh/ken_all.lzh
$ lha -x ken_all.lzh
$ nkf -w ken_all.csv >  zips_utf8.csv.orig
  • sqlite3にtableを作る
DROP TABLE IF EXISTS zips;
CREATE TABLE zips (
  id int(11) NOT NULL ,
  code char(5) DEFAULT '' NOT NULL,
  old_zip char(5) DEFAULT '' NOT NULL,
  new_zip char(7) DEFAULT '' NOT NULL,
  pref_ruby char(12) DEFAULT '' NOT NULL,
  city_ruby char(38) DEFAULT '' NOT NULL,
  town_ruby char(52) DEFAULT '' NOT NULL,
  pref char(8) DEFAULT '' NOT NULL,
  city char(20) DEFAULT '' NOT NULL,
  town char(34) DEFAULT '' NOT NULL,
  divided_flg char(1),
  lower_case_flg char(1),
  blocks_flg char(1),
  merge_flg char(1),
  update_code char(1),
  reason_code char(1),
  PRIMARY KEY (id)
);
  • これをコピペしてcreate_zips.sqlとでも名付けて保存。sqlite3で読み込む。
$sqlite3 zips.db
sqlite> .read create_zips.sql
sqlite> .quit
  • さきほどの郵便番号のデータにはidがないので付け足す。
#!/usr/bin/ruby                                                                 
# add_lineno.rb

lineno = 0
while ARGF.gets
  puts lineno.to_s + ',' + $_
  lineno += 1
end
$ ruby add_lineno.rb zips_utf8.csv.orig > zips_utf8.csv
  • できあがったファイルをsqliteにインポート
$ sqlite3 zips.db
sqlite> .import zips_utf8.csv zips

以上でsqlite3に郵便番号のデータができあがる。

続いてそれを扱うスクリプトを書くわけやけど、

#!/usr/local/bin/ruby -Ku
=begin
= dummy_insert.rb

==description
This file make dummy data with sql insert.

=requirement
 * Ruby 1.8.4 or later is installed
 * ActiveRecord 1.14.3 or later is installed
 * sqlite3-ruby 1.1.0 or later is installed
 * ruby/amazon 0.9.0 or later is installed
 * sqlite3 and zip data

=history
2006-7-23 by YOSHIDA Atsushi
=end

require 'amazon/search'
require 'rubygems'
require_gem 'activerecord'
include Amazon::Search


table_name="infomations"

ActiveRecord::Base.establish_connection(
                                        :adapter => 'sqlite3',
                                        :database => 'zips.db'
                                        )

class Zip < ActiveRecord::Base
end

def random_addr
  srand = Time.now
  Zip.find(rand(119369))
end

def random_datetime
  sprintf("2006-%02d-%02d %02d:%02d:%02d",
          rand(12), rand(28), rand(24), rand(60), rand(60))
end

DEV_TOKEN = 'YOUR AMZON DEVELOPER TOKEN'
SEARCH_KEY = 'ruby'
request = Request.new(DEV_TOKEN, nil, 'jp')
request.keyword_search(SEARCH_KEY) do |product|
  if product.authors
    author = product.authors[0]
  else
    author = 'Noman'
  end
  srand = Time.now

  addr = random_addr
  zip = addr.new_zip.sub(/"(\d{3})(\d{4})"/, '"\1-\2"')
  city_town = addr.city.delete('"') + addr.town.delete('"')
  insert_sql = <<"EOS"
INSERT INTO #{table_name} VALUES(
#{random_datetime},        #updatetime
#{random_datetime},        #createtime
"#{author}",                 #name
#{zip},                    #zip
#{addr.pref},              #pref
"#{city_town}",            #city
"一丁目十二番",            #home
"#{product.manufacturer}", #campany
"#{product.product_name}"  #note
);

EOS
puts insert_sql
end

こんな感じ。
これを実行すると

INSERT INTO infomations VALUES(
2006-07-08 04:50:42,        #updatetime
2006-11-26 01:13:08,        #createtime
"秋山 智俊",                 #name
"190-0162",                    #zip
"東京都",              #pref
"あきる野市三内",            #city
"一丁目十二番",            #home
"毎日コミュニケーションズ", #campany
"恋するプログラム?Rubyでつくる人工無脳"  #note
);

こんな感じのSQL文ができる。


ちなみにこれを使うためにはAmazonデベロッパトークンを取得して、定数DEV_TOKENのところに自分のでトークンを入れないと動かないので要注意