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

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の登場により思った以上に簡単に変換することができました。
