class ZipCodeJp::Export

Constants

ZIP_URL_DOMAIN

Private Class Methods

execute() click to toggle source
# File lib/zip_code_jp/export.rb, line 63
def self.execute
  zip_codes().each do |prefix, value|
    file_path = "#{ZipCodeJp::DATA_DIR}/zip_code/#{prefix}.json"
    File.open(file_path, 'wb') do |file|
      file.write JSON.generate(value)
    end
  end
end
to_hash(row) click to toggle source
# File lib/zip_code_jp/export.rb, line 14
def self.to_hash(row)
  {
    :zip_code        => row[2],
    :prefecture      => NKF.nkf('-S -w', row[6]),
    :prefecture_kana => NKF.nkf('-S -w', row[3]),
    :city            => NKF.nkf('-S -w', row[7]),
    :city_kana       => NKF.nkf('-S -w', row[4]),
    :town            => NKF.nkf('-S -w', row[8]),
    :town_kana       => NKF.nkf('-S -w', row[5])
  }
end
zip_codes() click to toggle source
# File lib/zip_code_jp/export.rb, line 35
def self.zip_codes
  zip_codes = {}
  prefecture_codes = YAML.load(File.open("#{ZipCodeJp::DATA_DIR}/prefecture_code.yml"))
  Zip::File.open(open(zip_url).path) do |archives|
    archives.each do |a|
      CSV.parse(a.get_input_stream.read) do |row|
        h = to_hash(row)
        h[:prefecture_code] = prefecture_codes.invert[h[:prefecture]]
        first_prefix  = h[:zip_code].slice(0,3)
        second_prefix = h[:zip_code].slice(3,4)
        zip_codes[first_prefix] = {} unless zip_codes[first_prefix]

        if zip_codes[first_prefix][second_prefix] && !zip_codes[first_prefix][second_prefix].instance_of?(Array)
          zip_codes[first_prefix][second_prefix] = [zip_codes[first_prefix][second_prefix]]
        end

        if zip_codes[first_prefix][second_prefix].instance_of?(Array)
          zip_codes[first_prefix][second_prefix].push h
        else
          zip_codes[first_prefix] = zip_codes[first_prefix].merge({second_prefix => h})
        end

      end
    end
  end
  zip_codes
end
zip_url() click to toggle source
# File lib/zip_code_jp/export.rb, line 27
def self.zip_url
  html = Nokogiri::HTML(open(ZIP_URL_DOMAIN))
  url = html.css('[href^="/zipcodedata/download"]').last.attributes['href']

  "#{ZIP_URL_DOMAIN}#{url}"
end