Skip to content

Instantly share code, notes, and snippets.

@sakama
Last active September 27, 2015 06:08
Show Gist options
  • Save sakama/1223637 to your computer and use it in GitHub Desktop.
Save sakama/1223637 to your computer and use it in GitHub Desktop.
日本郵便の郵便番号データのCSVファイルを元にMySQLにINSERTするSQL文を生成する
#!/usr/local/bin/ruby
# -*- coding: utf-8 -*-
# 日本郵便の郵便番号データをMySQLのテーブルにINSERTするSQL文を生成する
# http://www.post.japanpost.jp/zipcode/dl/kogaki.html
#
require 'csv'
require 'fileutils'
require 'nkf'
#ファイル名は標準入力から受け取る
inFileName = ARGV[0]
if !inFileName
puts 'エラー:引数に元CSVファイルのパスを指定して実行して下さい。'
exit(1)
end
basename = File.basename(inFileName, '.csv')
#OutFile用のディレクトリを作成
resultDir = 'sql/'
FileUtils.mkdir_p(resultDir) unless FileTest.exist?(resultDir)
outFileName = resultDir + basename+'.sql'
def get_pref_number(pref_name)
prefs = [
"北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県", "茨城県", "栃木県", "群馬県", "埼玉県", "千葉県",
"東京都", "神奈川県", "新潟県", "富山県", "石川県", "福井県", "山梨県", "長野県", "岐阜県", "静岡県", "愛知県", "三重県",
"滋賀県", "京都府", "大阪府", "兵庫県", "奈良県", "和歌山県", "鳥取県", "島根県", "岡山県", "広島県", "山口県", "徳島県",
"香川県", "愛媛県", "高知県", "福岡県", "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県", "鹿児島県", "沖縄県"
]
pref_number = prefs.index(pref_name)+1
end
#INSERT文を生成
reader = CSV.open(inFileName, 'r')
reader.shift
sql = ""
ins = "INSERT INTO zipcodes (id, zipcode01, zipcode02, pref, address01, address02, address01_kana, address02_kana) VALUES"
cnt = 0
reader.each do |line|
if cnt==0 || cnt%5000==0
if cnt>0 && cnt%5000==0
sql = sql.chop
sql = sql.chop
sql = sql + ";\n"
end
sql += ins
end
zipcode01 = line[1].to_s
zipcode02 = line[2].to_s.slice(3,4)
pref = get_pref_number(line[6].to_s)
address01 = line[7].to_s
address02 = line[8].to_s
address01_kana = NKF::nkf( '-WwXm0', line[4].to_s)
address02_kana = NKF::nkf( '-WwXm0', line[5].to_s)
insertValue = "('', '#{zipcode01.strip}','#{zipcode02.strip}',#{pref},'#{address01}','#{address02}','#{address01_kana}','#{address02_kana}'),\n"
sql += insertValue
cnt = cnt+1
end
#SQLを出力
File.open(outFileName, 'w') {|f|
f.write sql
}
puts outFileName + 'に出力を完了しました。'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment