見出し画像

REALITYに郵便番号検索機能を付けてみたよ!REALITY Advent Calendar 2023

はじめに

こんにちは、REALITY Advent Calendar 2023 10日目担当、ドッグトレーナー兼ラーメン研究家で、さらにはサーバエンジニアのナオヤです。

今年で早3回目となるREALITY開発合宿ですが、初年度から合宿実行委員を務めていた私ですが、今年は参加者側としての参加!さらには、可愛すぎる愛犬をホテルに預けるのも躊躇われたので、初のオンライン参加となりましたが、それでも合宿は非常に充実したものになりました。

可愛すぎる!

今回作る機能は郵便番号検索機能

早速ですが、今年開発した機能の紹介をしたいと思います。ちなみに、昨年の合宿ではAndroidエンジニアとして、位置情報共有機能を開発しました。

今年の開発合宿の開発は、郵便番号検索機能の開発にしました!

なぜ、郵便番号検索機能の開発にしたかというと、今までREALITY内のイベント入賞者の方へ景品などを送る際に、住所をGoogleフォームで送って頂いていたのですが、最近アプリ上から直接提出することが可能になりました。アプリから住所を入力しやすいように、郵便番号検索機能の開発をしてみることにしました。開発ボリューム的にも合宿期間内で作りきれそうだったということもあります。

郵便番号検索機能とは

郵便番号検索機能についてですが、簡単に説明すると、WEBサイトやさまざまなアプリのUI上で、住所入力の前に、郵便番号を入れたら先に住所が出てくるアレです。アレをREALITY上の機能で実現する、というのが今回の合宿の個人テーマです。

実は郵便番号検索は奥が深いということを知る…

事前の検討段階では、日本郵政が郵便番号データをcsvで公開していたので、データをパースしてDBに入れてAPIでそれを取得したら終わりだなぁ、くらいの軽い気持ちで合宿当日を迎えました。

現実はそんなに甘くなかった

さて、実際に開発合宿がスタートしました。まずはDBにテーブルを作るために、早速、日本郵政が公開していた KEN_ALL.CSV のファイルの先頭部分を見てみました。実際は以下のようなデータが12万行くらいあります。

01101,"060  ","0600000","ホッカイドウ","サッポロシチュウオウク","イカニケイサイガナイバアイ","北海道","札幌市中央区","以下に掲載がない場合",0,0,0,0,0,0
01101,"064  ","0640941","ホッカイドウ","サッポロシチュウオウク","アサヒガオカ","北海道","札幌市中央区","旭ケ丘",0,0,1,0,0,0
01101,"060  ","0600041","ホッカイドウ","サッポロシチュウオウク","オオドオリヒガシ","北海道","札幌市中央区","大通東",0,0,1,0,0,0
01101,"060  ","0600042","ホッカイドウ","サッポロシチュウオウク","オオドオリニシ(1-19チョウメ)","北海道","札幌市中央区","大通西(1〜19丁目)",1,0,1,0,0,0
01101,"064  ","0640820","ホッカイドウ","サッポロシチュウオウク","オオドオリニシ(20-28チョウメ)","北海道","札幌市中央区","大通西(20〜28丁目)",1,0,1,0,0,0

まずは最初の1行を見ていきます

01101,"060 ","0600000","ホッカイドウ","サッポロシチュウオウク","イカニケイサイガナイバアイ","北海道","札幌市中央区","以下に掲載がない場合",0,0,0,0,0,0

以下に掲載がない場合

なんか様子がヘンです・・・。

郵便番号と住所が1行に書かれているんだろうなぁくらいの気持ちでいましたが、どうやらそんな感じではなさそう。

どういうフォーマットになっているのか色々と調べてみたところ、この日本郵政が公開している KEN_ALL.CSV はそもそも色々な問題が存在しており、そのままではDBに入れる検索用の元データとしては、全く使えないということがわかりました。

提供元の日本郵便自体が認識している大きな問題は以下のようです

1. 文字コードがShift-JIS
2. 読み仮名が半角カナ
3. 複数行に分割されているレコードがある
4. 町名に人間向けの補足説明が含まれている

総務省 日本郵便株式会社 郵便局データ利活用に関する 取組状況より

最初の1行目にある 「以下に記載のない場合」 はまさにそれでした。

ようするに、 3. 複数行に分割されているレコードがある でもそうなのですが、1行だけでは意味をなさないデータになっている場合がある、というカオスなものでした

さらに調べていくと、今年の6月に大きな問題の 1−3 までは解消された utf_all.csv というが出たらしいということがわかりました。ですが、結局、町名に人間向けの補足説明が含まれている という問題は解消されておらず、そのままでは使えないということでした。問題を解消するための、さらなるデータ変換方法は色々あるようでしたが、様々なケースを想定しないといけないようで、変換ロジックを書くのだけでもかなりの手間が掛かりそうでした。

今回は、合宿の期間内に完全に郵便番号検索機能を作りきりたく、utf_all.csv のデータ変換にだけ時間を費やす訳にはいかなかったので、予めDBに入れられるような形に修正済みの、郵便番号データ(加工済バージョン)のcsvファイルが、zipcloud様にて無償にて公開されていたので、そちらを使用させていただくことにしました。圧倒的感謝です!

DBにデータを入れてAPI呼び出しを実装

テーブルを作成し、csvの郵便番号と住所のカラムからINSERT文を作成して、データを投入して検索元のデータが完成です!

あとは本来はアプリのUIから呼ばれるのですが、今回はWEBからAPIを呼び出して、取得できた結果を表示するようにしました。

実際WEB上からAPI呼び出して検索した結果の画面

合宿期間内に無事、APIが完成しました!

既に実際のアプリで使用されています

さて、開発合宿で作成した郵便番号検索機能ですが、合宿の後に、色々と手直しが入った後、全員が確認出来る場所ではないのですが、以下のように住所提出などがある際に実際のアプリ上でも既に使用されています。

まとめ

軽い気持ちで開発のテーマにした郵便番号からの住所検索ですが、日本郵便が提供している無料のデータは一筋縄ではいかないということがわかりました。また、無償で加工済みデータを公開されている方々には本当に感謝いたします。

郵便番号を入力したら住所が出てくる機能はいろんなところで見ますが、今後は見る目が変わりそうですw

明日のアドベントカレンダーは!

明日はiOSエンジニアのかむいさんの「REALITY思い出ウィジェット」になります!
お楽しみに!