ナレッジ

yubinbango-dataをどうやって生成するか

目次

郵便番号から住所を補完するライブラリ「yubinbango」を継続的に利用するにあたり、当該ライブラリが参照している郵便データ「yubinbango-data」を自前でメンテナンスできるか確認します。

thumbnail

PROBLEM

  • 「yubinbango/yubinbango」を利用するにあたり「yubinbango/yubinbango-data」の更新が継続的に行われるかサービス継続性の懸念がある
    • そこで自前でメンテナンスをする場合の対処方法を事前に知っておきたい

SOLUTION

というわけで、yubinbango-dataの中身であるken_all.csvとjigyosyo.csvを安定して変換する方法を確認します。

ken_all.csvを正規化する

yubinbango-dataのken_all.csvの部分はアイビスが提供しているzipcloudを参照しているようなので、そちらに合わせて利用します。

sudo apt install nkf
{
  curl -sSL "http://zipcloud.ibsnet.co.jp/zipcodedata/download?di=1625040649647" -o ./x_ken_all.zip;
  unzip -p x_ken_all.zip | nkf -w;
  rm x_ken_all.zip
} >ken_all.csv

zipcloudを使うことに抵抗がある場合はgokenallもありますが、正規化によって一つの郵便番号に複数の町名番地が存在するため郵便番号をキーとするyubinbango-dataに変換する際には工夫が必要です。

go get github.com/oirik/gokenall/cmd/kenall
{ kenall download -x | kenall normalize } >ken_all.csv

jigyosyo.csvを取得する

jigyosyo.csvは特に正規化は必要ないです。

{
  curl -sSL https://www.post.japanpost.jp/zipcode/dl/jigyosyo/zip/jigyosyo.zip -o ./jigyosyo.zip;
  unzip -p jigyosyo.zip | nkf -w;
  rm jigyosyo.zip
} >jigyosyo.csv

yubinbango-dataを生成する

ken_all.csvとjigyosyo.csvをUNIONしてjqで郵便番号をキーとしたオブジェクトに変換します。一部buildingカラムがnullを持っておりyubinbango-dataと異なる部分はありますが、大凡同等の状態にまで持っていくことが出来ました。

brew install noborus/tap/trdsql
for i in {001..999}; do
  trdsql -ojson "
    SELECT *
    FROM (
      SELECT c3 zip, c8 city, c9 town, NULL building FROM ken_all.csv
      UNION SELECT c8 zip, c5 city, c6 town, c7 building FROM jigyosyo.csv
    )
    WHERE SUBSTRING(zip,0,4) = '$i'
    ORDER BY zip ASC
  " \
  | jq --compact-output '
    .
    | to_entries
    | map({ (.value.zip): [1, .value.city, .value.town, .value.building] })
    | add
  ' \
  | sed -E 's/(.+?)/$yubin(\1);/g' \
  >$i.js;
done

WRAPUP

昔から何かと話題に上がるken_all.csvですが、正規化のサービスに加えCSV用SQLクライアントとjqの登場により思った以上に簡単に変換することができました。