Rapid Express

Rapid Express

中小企業を支援するLinuxベースのWebアプリケーション開発

Rapid Express RSS Feed
 
 
 
 

日本郵政の郵便番号データの見方(とテストパターン)

住所入力フォームでよくある、郵便番号から住所を検索するシステムでは、日本郵便の郵便番号データを利用しています。

検索ボタンを押してから検索結果を住所欄に貼り付ける処理には、Ajaxを使うとポップアップウィンドウを開かずにスムーズに処理できます。

同じ郵便番号に複数の住所が割り当てられている場合はユーザーに選択を促すわけですが、問題は候補選択のインターフェースなどではなく、日本郵政の郵便番号データをどう解釈してデータベースを構築するかにあります。

なぜなら、このデータがCSVとは名ばかりのとんでもないデータ構造をしているからです(笑)

ダウンロードしたデータは次のようなカンマ区切りですが・・・

01209,"06805","0680546","ホッカイドウ","ユウバリシ","ナンブアオバチョウ","北海道","夕張市","南部青葉町",0,0,0,1,0,0

ここでは次のように必要部分だけを抜き出したデータとして扱います。

0680546 北海道 夕張市 南部青葉町

この郵便番号データから、住所検索システム用のデータベースに変換するプログラムが肝になるわけですが、私が作成したものは次のデモプログラムの入力フォームで確認できます。

ユーザー管理デモプログラム
業務プログラムのユーザー管理のサンプルとして、年賀状あて名印刷を業務に見立てたデモプログラムです。

このページで解説するテストパターンの郵便番号を入力してみて、他の同じような入力フォームと比較してみてください。・・・えっ、自分の住まいは都会で、郵便番号から出てくる住所は一つだから関係ない?

それはまあそうなんでしょうが、プログラミングに対する配慮と技術のサンプルということでお願いします(w


A.実際にデータが2行あるパターン

0680546 北海道 夕張市 南部青葉町
0680546 北海道 夕張市 南部菊水町

説明不要かもしれませんが・・・郵便番号から住所を自動入力する機能があるサイトで、まずはこの番号を入力してみてください。

有無を言わさず「南部青葉町」が自動入力されたり、「夕張市」までが入力されて町名が入らないなら、ユーザー選択はさせないと割り切った方針で作られたプログラムで、それはそれでアリだと思います。そのココロザシ、イサギヨシと言ったところです。

むしろ、このパターンでは選択肢が出るのに、後述するCパターンでは選択肢が出ないとしたら、郵便番号データの構造を理解していない中途半端なプログラムだと言えます。

B.カッコつきの住所

データの中には住所にカッコが付いているものがあります。

0880108 北海道 釧路市 音別町音別原野基線(二俣川向)
0780186 北海道 旭川市 神居町西丘(8?22番地)

専門用語は知りませんが・・・法的には不要な通名のようなものながら、普通に住居表示として利用されている表記だそうです。ということで、カッコ記号を取って「音別町音別原野基線二俣川向」や「神居町西丘8?22番地」としてあげるものです。

C.カッコの中が選択肢になるもの

カッコの中に読点があって、複数の住所が示されるものがあります。javascriptで複数候補を選択させるのはAパターンだけでないと、最初に説明したものです。

0410842 北海道 函館市 滝沢町(57、97、98番地)

「滝沢町57」、「滝沢町97」、「滝沢町98番地」と分けるが正解です。・・・「番地」をそれぞれに振り分けるがベストですが、読点区切りは番地だけでなく小字などと混在することもあるので難しいです。

D.カッコの中が範囲指定であるパターン

0690867 北海道 江別市 元野幌(1?440番地)

本来は1番地から440番地まで展開されるものですがそれを選択肢にするのは不可能です。かと言って、これをそのまま住所として貼り付けても、ユーザは自分で削除する羽目になりますから、カッコ以下を丸ごと削除して使用するのが親切です。

1320013 東京都 江戸川区 江戸川(1?3丁目、4丁目1?14番)

読点区切りと範囲指定が混在するものもあります。データを切り出すロジックにもよりますが、処理をすり抜けてしまわないように、この番号もテストが必要です。

E.地割と小字の併記パターン

東北のほうには住所表記に「地割」というのが出てきます。

0240341 岩手県 和賀郡西和賀町 杉名畑44地割(湯田ダム管理事務所、後口山、当楽)

Cパターンと同様に処理すれば良いようにも思いますが、次のようなパターンも多いので扱いに困ります。

0287903 岩手県 九戸郡洋野町 種市第1地割?第3地割(八木南町、八木北町)

どうも地割と小字を併記しているようですが、東北には詳しくないので実態はわかりません。まあ、前半が範囲指定ですからカッコ内は2つに分けず削除します。

さらに、範囲指定である「第○地割」を削除しても「種市」は残りますから、「九戸郡洋野町種市」までを住所欄に貼り付けるべきでしょう。

F.その他のカッコの使われ方

カッコは次のような使われ方もしています。

8993203 鹿児島県 日置市 日吉町吉利(その他)
9800021 宮城県 仙台市青葉区 中央(次のビルを除く)
9806190 宮城県 仙台市青葉区 中央アエル(地階・階層不明)

住所から郵便番号を特定するには必要な情報ですが、郵便番号から住所を逆引きするときは不要です。削除して使用するべきものですね。

G.データは1行で終わるとは限らない

そろそろ郵便番号データの真髄に触れます(笑)

これって本当にCSVデータなんでしょうか?

0660005 北海道 千歳市 協和(88?2、271?10、343?2、404?1、427?
0660005 北海道 千歳市 3、431?12、443?6、608?2、641?8、814、842?
0660005 北海道 千歳市 5、1137?3、1392、1657、1752番地)

開いたカッコが閉じていないときは、データが次の行まで続いていることになります。そして、読点区切りも見事に分断されているのです。

「協和88?2」、「協和271?10」・・・そして「協和427?3」や「協和842?5」と展開されるべきものです。候補は全部で15ですね。

この郵便番号を入力したときに、「千歳市協和88?2」と「千歳市3」、「千歳市5」の3候補が出るお粗末なシステムは、期待にたがわず少なくないです(汗)

選択肢が日本一多くなるのは次の郵便番号ではないかと思われますが、どうでしょう。

9218046 石川県 金沢市 大桑町(ア、イ、ヰ、ウ、上野、ヲ、オ乙、鐘搗山、上川原、上猫下、
9218046 石川県 金沢市 ク、ケ、御所谷、小寺山、シ、下上野、下西欠、平、チ、ツ乙、ツ丙、テ、ト、
9218046 石川県 金沢市 中上野、中尾山、中平、中ノ大平、ニ、西ノ山、猫シタイ、ノ、ハ、開、ヘ、
9218046 石川県 金沢市 ホ、法師山、坊山、マ、鱒川淵、ム、元末、元涌波庚、ヤ、リ、ル、レ乙、
9218046 石川県 金沢市 レ甲、ロ乙、ロ甲、和)

H.カッコの外でリストになるパターンも

読点区切りによるリストはカッコの中だけ作られるとは限りません。

0295503 岩手県 和賀郡西和賀町 穴明22地割、穴明23地割

これもきちんと候補選択に展開させる必要があります。

I.かぎカッコによる例外表記のパターン

かぎカッコは例外表記に使われていますので、かぎカッコは丸ごと削除するようにします。

かぎカッコは2行にわたることもありますから、1行ずつ処理するスクリプトでは配慮が必要になります。

0330071 青森県 上北郡六戸町 犬落瀬(内金矢、内山、岡沼、金沢、金矢、上淋代、木越、権現沢
0330071 青森県 上北郡六戸町 四木、七百、下久保「174を除く」、下淋代、高森、通目木、坪毛沢「2
0330071 青森県 上北郡六戸町 5、637、641、643、647を除く」、中屋敷、沼久保、根古橋、堀切
0330071 青森県 上北郡六戸町 沢、南平、柳沢、大曲)

かと思うと、“「○○」以外”という表記もありますから、かぎカッコを削除する前にこちらを削除しておかないと、変なことになります。

0482402 北海道 余市郡仁木町 大江(1丁目、2丁目「651、662、668番地」以外、3丁目5、1
0482402 北海道 余市郡仁木町","3?4、20、678、687番地)

かぎカッコを削除した残りが範囲指定となり、結果としてカッコ内をすべて削除することになることもあります。

3842304 長野県 北佐久郡立科町 茂田井(1?500「211番地を除く」「古町」、2527?2529
3842304 長野県 北佐久郡立科町 「土遠」)

例外表記には通常のカッコが使われているところもあります。これはFパターンとして削除するべきものですね。

3812241 長野県 長野市 青木島町青木島乙(956番地以外)

.

以下、思いつきでよそ様のサイトをテストしてみました。

0680546 0880108
楽天会員登録 ()削除 すべて共通部分までの候補なしですが、破綻はありません。





Leave a Reply



Tags

Links




Meta


TMAX.MYOPENSRC.COM