住所を関数で分けようとして「市川市」で壊れた日

kamitool 運営者・個人開発の記録

1つのセルに入った住所を、都道府県と市区町村に分ける関数を組んだ。うまく動いていたはずが、ある会社の住所だけ結果がおかしくなっていた話と、そこから作ったツールの話を書く。

木目のデスクの上に、日本地図が印刷された紙と、住所の一覧が印刷された紙が並べて置かれている。赤ペンで市区町村名に印が付けられ、付箋にメモが書かれている様子。
「市川市」「四日市市」のような住所だけ、関数の結果が途中で切れていた。

「都道府県だけなら関数1本」のはずだった

名簿の住所を都道府県・市区町村・それ以降の3列に分けたいと思い、Excelの関数を調べた。都道府県を取り出す関数は、すぐに見つかった。

=IF(MID(A2,4,1)="県",LEFT(A2,4),LEFT(A2,3))

47都道府県のうち「神奈川県」「和歌山県」「鹿児島県」の3つだけが4文字で、残りは3文字。4文字目が「県」かどうかを見れば都道府県は取れる。ここまでは思ったとおりに動いた。

市区町村を「最初の市まで」で切ったら、市川市が壊れた

次に市区町村を取り出そうとして、「最初に出てくる『市』『区』『町』『村』までを取る」という式を組んだ。ほとんどの住所は正しく分かれたが、一部の住所だけおかしな結果になった。

住所「最初の市まで」で切ると本来の市区町村
千葉県市川市八幡市市川市
三重県四日市市諏訪町四日市四日市市
広島県廿日市市下平良廿日市廿日市市
神奈川県横浜市港北区日吉横浜市横浜市港北区

「市川市」は、市の名前そのものに「市」という字が入っている。だから「最初の市」で切ると、市区町村名が完成する前に切れてしまう。政令指定都市の「区」も、区まで含めて1つの単位として扱いたい場面が多く、単純な文字での判定では対応できなかった。

気づいたのは「実在する地名の一覧と照らし合わせるしかない」ことだった

例外を1つ見つけるたびに式へ条件を足していったが、廿日市市、四日市市、余市郡余市町と、次々に新しい例外が出てきて、式はすぐに読めない長さになった。

ある日、この方法には限界があると認めた。市区町村名は、文字のパターンでは判定できない。実在する市区町村名の一覧と照らし合わせて、いちばん長く一致する名前を探すしかない。

総務省が公開している全国の市区町村コードの一覧を使い、住所の先頭から、一覧にある名前のうちいちばん長く一致するものを探すようにした。「市川市」を「市」で切ることは、これでなくなった。

ここで書いたツールを、実際に試す

住所を分割するツールを開く

実際にどう動くか

住所を貼り付けると、都道府県・市区町村・それ以降の3列に分けて出力する。

住所分割結果
千葉県市川市八幡2-1千葉県 / 市川市 / 八幡2-1
神奈川県横浜市港北区日吉1-2-3神奈川県 / 横浜市港北区 / 日吉1-2-3
横浜市中区山下町(都道府県省略)神奈川県(補完)/ 横浜市中区 / 山下町

同じ市区町村名が複数の都道府県にある場合

都道府県が省略された住所は、市区町村名から補うようにしている。ただし「府中市」のように東京都と広島県の両方に存在する市区町村名は、機械的に決めつけず、候補を示して確認を求める形にした。分からないものを分かったふりで処理しないようにしている。

作ってみて変わったこと

例外を見つけるたびに式を修正する、という作業がなくなった。市区町村の一覧そのものを更新すれば済むので、合併や名称変更があっても対応しやすくなった。

もう1つの変化は、住所の分割を怖がらなくなったことだ。以前は「また知らない例外が出てくるかもしれない」という不安があり、大量の住所を一度に処理するのを避けていた。今は一覧と照合する仕組みそのものが例外を吸収してくれるので、件数の多さを気にせず貼り付けられる。

使うときの注意

一覧と照らし合わせる方式には限界もある。存在しない番地や、書式として崩れた住所は、書かれたとおりに分けるだけで、内容が正しいかどうかまでは確認していない。宛名として外に出す前には、最後に人の目で見て確認する工程を必ず残している。

よくある質問

政令指定都市の区はどうなりますか?

区まで含めて1つの市区町村として出力します。「横浜市港北区」「京都市中京区」のような形です。

古い市町村名で書かれた住所も分けられますか?

市区町村の一覧は令和6年1月1日現在のものです。それ以降に合併や名称変更があった住所は、正しく分けられないことがあります。

番地と建物名も分けられますか?

オプションで分けられます。ただし番地の書き方は「1-2-3」「1丁目2番3号」など様々なため、推定として扱っています。

関連する読みもの・ツール

同じように、自分の手作業をツールにしたものを他にも置いています

kamitoolはゲームや事務仕事の細かいツールが中心ですが、ネットショップの在庫・利益管理や、モール間のデータ移行のようなものは、noteで「TOOL BOX|手作業をツールにする」として公開しています。オフラインで動くファイル1枚の形で配っているものもあります。