ダミーの住所データを作るスクリプト
お問い合わせとかのデータを作らないといけない事ってのは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
作り方
$ 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のところに自分のでトークンを入れないと動かないので要注意