16
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rails5で都道府県、市区町村のマスターデータをワンライナーで作成

Posted at

郵便局が提供している郵便番号データから都道府県と市区町村のMySQLのマスタデータをワンライナーで作成します

処理の流れ

  • 郵便番号データを郵便局のサイトからダウンロード
  • ダウンロードしたZIPファイルを解凍し保存
  • 保存したCSVファイルを読み込みMySQLに保存

テーブル作成

最終的に完成するテーブルは以下のようになります
今回は必要最小限の構造となってます。

都道府県テーブル

id name
1 北海道
2 青森県

市区町村テーブル

id pref_id name
1 1 札幌市北区

マイグレーション

都道府県テーブル

create_prefs.rb
class CreatePrefs < ActiveRecord::Migration[5.1]
  def change
    create_table :prefs do |t|
      t.string :name, :limit => 4, :unique => true

      t.timestamps
    end
  end
end

市区町村テーブル

create_cities.rb
class CreateCities < ActiveRecord::Migration[5.1]
  def change
    create_table :cities do |t|
      t.integer :pref_id
      t.string :name, :limit => 16

      t.timestamps
    end
  end
end

マイグレーション実行

マイグレーションを実行しテーブル作成

rails db:migrate

seedファイル

今回は初期データを追加するので
db/seeds.rbに追記していきます

seeds.rb
require 'csv'
require 'zip'

DLURL           = "http://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip"
SAVEDIR         = "db/"
CSVROW_PREFNAME = 6
CSVROW_CITYNAME = 7

savePath = ""

# 住所CSVダウンロード、解答し保存
open(URI.escape(DLURL)) do |file|
  ::Zip::File.open_buffer(file.read) do |zf|
    zf.each do |entry|
      savePath = SAVEDIR + entry.name
      zf.extract(entry, savePath) { true }
    end
  end
end

# 住所CSVを読み込みDBに保存
CSV.foreach(savePath, encoding: "Shift_JIS:UTF-8") do |row|
  prefName = row[CSVROW_PREFNAME]
  cityName = row[CSVROW_CITYNAME]
  pref = Pref.find_or_create_by(:name => prefName)
  City.find_or_create_by(:name => cityName, pref_id: pref.id)
end

File.unlink savePath

seed実行

以下コマンドで上記スクリプトを実行するとデータが完成

rails db:seed
16
15
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?