module Jipcode::JapanPost

Constants

ZIPCODE_FILES
ZIPCODE_URLS

Public Class Methods

download_all() click to toggle source
# File lib/jipcode/japan_post.rb, line 26
def download_all
  ZIPCODE_URLS.each do |type, url|
    url = URI.parse(url)
    http = Net::HTTP.new(url.host, 443)
    http.use_ssl = true
    res = http.get(url.path)
    File.open("zipcode/#{type}.zip", 'wb') { |f| f.write(res.body) }
  end
end
import_all() click to toggle source
# File lib/jipcode/japan_post.rb, line 36
def import_all
  File.rename(ZIPCODE_PATH, 'zipcode/previous') if File.exist?(ZIPCODE_PATH)
  Dir.mkdir(ZIPCODE_PATH)

  zipcodes = unpack(:general)
  import(zipcodes) do |row|
    zipcode    = row[2] # 郵便番号
    prefecture = row[6] # 都道府県
    city       = row[7] # 市区町村
    town       = row[8] # 町域

    [zipcode, prefecture, city, town]
  end

  zipcodes = unpack(:company)
  import(zipcodes) do |row|
    zipcode    = row[7] # 郵便番号
    prefecture = row[3] # 都道府県
    city       = row[4] # 市区町村
    town       = row[5] + row[6] # 町域 + 番地

    [zipcode, prefecture, city, town]
  end

  FileUtils.rm_rf('zipcode/previous')
rescue => e
  FileUtils.rm_rf(ZIPCODE_PATH)
  File.rename('zipcode/previous', ZIPCODE_PATH) if File.exist?('zipcode/previous')
  raise e, '日本郵便のデータを読み込めませんでした。'
end
update() click to toggle source
# File lib/jipcode/japan_post.rb, line 18
def update
  download_all
  import_all

  # データの更新月を記録する
  File.open('zipcode/current_month', 'w') { |f| f.write(Time.now.strftime('%Y%m')) }
end

Private Class Methods

import(zipcodes) { |row| ... } click to toggle source
# File lib/jipcode/japan_post.rb, line 82
def import(zipcodes)
  duplicated_row = false
  CSV.parse zipcodes do |row|
    address = yield(row)
    puts row unless address

    town = address[3]
    if duplicated_row
      duplicated_row = false if town.end_with?(')')
      next
    else
      duplicated_row = true if town.include?('(') && !town.include?(')')
    end

    # 町域等に含まれる曖昧な表記を削除
    unless town.include?('私書箱')
      address[3] = town.sub(/((.+|以下に掲載がない場合)$/, '')
    end

    # 町域等の内容が市区町村の内容と重複する場合、空にする
    if town.include?('の次に番地がくる場合') || town.include?('一円')
      address[3] = nil
    end

    # 10万件以上あるので郵便番号上3桁ごとに分割
    filepath = "#{ZIPCODE_PATH}/#{address[0][0..2]}.csv"
    open(filepath, 'a') { |f| f.write("#{address.join(',')}\n") }
  end
end
unpack(type) click to toggle source

Private

# File lib/jipcode/japan_post.rb, line 69
def unpack(type)
  download unless File.exist?("zipcode/#{type}.zip")

  content = ::Zip::File.open("zipcode/#{type}.zip") do |zip_file|
              entry = zip_file.glob(ZIPCODE_FILES[type]).first
              raise '日本郵便のファイルからデータが見つかりませんでした。' unless entry
              entry.get_input_stream.read
            end

  # 文字コードをSHIFT JISからUTF-8に変換
  NKF.nkf('-w -Lu', content)
end

Private Instance Methods

download_all() click to toggle source
# File lib/jipcode/japan_post.rb, line 26
def download_all
  ZIPCODE_URLS.each do |type, url|
    url = URI.parse(url)
    http = Net::HTTP.new(url.host, 443)
    http.use_ssl = true
    res = http.get(url.path)
    File.open("zipcode/#{type}.zip", 'wb') { |f| f.write(res.body) }
  end
end
import(zipcodes) { |row| ... } click to toggle source
# File lib/jipcode/japan_post.rb, line 82
def import(zipcodes)
  duplicated_row = false
  CSV.parse zipcodes do |row|
    address = yield(row)
    puts row unless address

    town = address[3]
    if duplicated_row
      duplicated_row = false if town.end_with?(')')
      next
    else
      duplicated_row = true if town.include?('(') && !town.include?(')')
    end

    # 町域等に含まれる曖昧な表記を削除
    unless town.include?('私書箱')
      address[3] = town.sub(/((.+|以下に掲載がない場合)$/, '')
    end

    # 町域等の内容が市区町村の内容と重複する場合、空にする
    if town.include?('の次に番地がくる場合') || town.include?('一円')
      address[3] = nil
    end

    # 10万件以上あるので郵便番号上3桁ごとに分割
    filepath = "#{ZIPCODE_PATH}/#{address[0][0..2]}.csv"
    open(filepath, 'a') { |f| f.write("#{address.join(',')}\n") }
  end
end
import_all() click to toggle source
# File lib/jipcode/japan_post.rb, line 36
def import_all
  File.rename(ZIPCODE_PATH, 'zipcode/previous') if File.exist?(ZIPCODE_PATH)
  Dir.mkdir(ZIPCODE_PATH)

  zipcodes = unpack(:general)
  import(zipcodes) do |row|
    zipcode    = row[2] # 郵便番号
    prefecture = row[6] # 都道府県
    city       = row[7] # 市区町村
    town       = row[8] # 町域

    [zipcode, prefecture, city, town]
  end

  zipcodes = unpack(:company)
  import(zipcodes) do |row|
    zipcode    = row[7] # 郵便番号
    prefecture = row[3] # 都道府県
    city       = row[4] # 市区町村
    town       = row[5] + row[6] # 町域 + 番地

    [zipcode, prefecture, city, town]
  end

  FileUtils.rm_rf('zipcode/previous')
rescue => e
  FileUtils.rm_rf(ZIPCODE_PATH)
  File.rename('zipcode/previous', ZIPCODE_PATH) if File.exist?('zipcode/previous')
  raise e, '日本郵便のデータを読み込めませんでした。'
end
unpack(type) click to toggle source

Private

# File lib/jipcode/japan_post.rb, line 69
def unpack(type)
  download unless File.exist?("zipcode/#{type}.zip")

  content = ::Zip::File.open("zipcode/#{type}.zip") do |zip_file|
              entry = zip_file.glob(ZIPCODE_FILES[type]).first
              raise '日本郵便のファイルからデータが見つかりませんでした。' unless entry
              entry.get_input_stream.read
            end

  # 文字コードをSHIFT JISからUTF-8に変換
  NKF.nkf('-w -Lu', content)
end
update() click to toggle source
# File lib/jipcode/japan_post.rb, line 18
def update
  download_all
  import_all

  # データの更新月を記録する
  File.open('zipcode/current_month', 'w') { |f| f.write(Time.now.strftime('%Y%m')) }
end