2
4
テーマ、知りたいこと
タイトルの通りです。
背景、状況
Excelで管理している住所録に入力規則を設けようという話になり、その中で「住所の番地は半角英数字で入力する」という規則になりました。この入力規則に従い、現在の住所録の表記も半角英数字に統一しなければなりません。
しかし、例えば『東京都八王子市高尾町一七八六』という住所を『東京都八王子市高尾町1786』と変換したい場合、関数や置換機能を使うと『東京都8王子市高尾町1786』といった風に、地名の漢数字も英数字に変換されてしまうといったことが予想されます。
私の頭で考え付くのは市町村フィールドと番地フィールドに分割し、番地フィールドのみ置換や関数での変換を行うことですが、住所のレコード数が膨大なため、手作業での分割が現実的ではありません。
皆様の知恵をお貸し頂ければと思います、よろしくお願い致します。
試した事・調査した事
インターネット検索で『住所 番地のみ 英数字変換』と検索し同じ課題を取り上げているページを探しましたが、漢数字の地名に言及されたページは見つけられませんでした。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答16件
#1
総合スコア85785
投稿2023/10/19 06:35
編集2023/10/19 06:40状況に応じて楽な方法を柔軟に考えるのでしょうか。
・公立中学校の生徒住所のように特定の地域だけのものか?全国か?
・郵便番号のデータはあるのか?
・通称的な住所もあるか?(「京都市中京区河原町通四条上る一筋目西入る」みたいな)
・番地の後にマンション名や「○○様方」があるか?その固有名詞に漢数字があるようなケースも考慮するのか?
・レコード数が膨大とは具体的には?
・変換は今回一回切りか?定期的に行うのか?定期的なら毎日?毎年?
2つ目3つ目は、郵便番号簿から検索した住所を使ってマッチングさせるという処理が可能かどうかと言うことです。
例のケースだと「東京都八王子市高尾町」まで認識できるはずななので、それ以降を変換すれば良い。
#2
退会済みユーザー
総合スコア0
投稿2023/10/19 06:47
編集2023/10/19 06:51・全国です
・全てのレコードに郵便番号が載っています
・通称的な住所があります
・2~3000件はあるかと思います
・変換は一度きりだと思います。今後は入力規則に従ってレコードを追加してもらいます
追記
・様方を含むレコードもあります、ただしごく一部ですので、様方で検索して手修正するので考慮は不要かと思います
・現時点で置換したい住所フィールドの中にマンション等の建物名が含まれているものもありますが、建物名は別フィールドに移動させます
2つ目3つ目は、郵便番号簿から検索した住所を使ってマッチングさせるという処理が可能かどうかと言うことです。
例のケースだと「東京都八王子市高尾町」まで認識できるはずななので、それ以降を変換すれば良い。
具体的どのような手順で実現できますでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#3
総合スコア297
投稿2023/10/19 06:48
外部サービスに丸投げした方が早そうです。
↓こんなのとか
https://www.geolonia.com/archives/4956/
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#5
総合スコア297
投稿2023/10/19 07:06
私はそこのサービスの回し者ではありませんが、以下のような
オプションもあります。
セキュリティやデータに関する社内の規定やポリシーのために
データをアップロードできないケースや、データやシステムが
プライベートクラウドやオンプレミスの環境で稼働しているため
サービスを利用できないという問題を解決可能です
https://quicknja.com/#/api
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#7
総合スコア85785
投稿2023/10/19 07:22
・2~3000件はあるかと思います
「膨大」ということで数十万~数百万件なのかなと思ってましたが、
その程度の量で一度切りであれば、全部一括変換して、「8王子」などを目で見て直すので十分かと思います。
下記も無しで良いのでは?
具体的どのような手順で実現できますでしょうか?
数千件レベルの話なのでExcelで作業するとして、まず日本郵便から郵便番号簿CSVを取得して、
住所シートで、郵便番号列からXLOOKUPで番号簿を検索して「東京都八王子市高尾町」のような列を生成して、
住所列の「東京都八王子市高尾町一七八六」から、生成した「東京都八王子市高尾町」列をSUBSTITUTEで削除すれば「一七八六」が残るので変換して、「東京都八王子市高尾町」を連結すればいいかと。
ただ、確か複数の町名に該当する郵便番号もあったような気もしますので、そういうのは手作業で。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#8
総合スコア938
投稿2023/10/19 07:24
編集2023/10/19 07:28まずこの手の問題に関しては「ありとあらゆる住所データを100%の精度で自動変換することはまず不可能である」ということを念頭に置いていただくとして。
私の頭で考え付くのは市町村フィールドと番地フィールドに分割し、番地フィールドのみ置換や関数での変換を行う
住所と建物名が1つの列の値に含まれているのであれば、更に[番地]と[建物名]を分割する必要があります。
建物名の中に(変換してはいけない)漢数字が含まれているケースは大いにあり得るからです。
例えば「番地と建物名の間には必ず半角/全角スペースが1つ以上挿入されている」というルールが設けられているのであれば、そのスペースを区切り文字として分割すればよいですが、それが徹底されているかどうかは実際のデータを1つ1つ検証しない限りは判りません。
スペースが挿入されていなかったり、番地より前の位置にスペースが挿入されていたりするケースだって充分にあり得ます。
・全国です
・全てのレコードに郵便番号が載っています
例えば、日本郵便が公開している郵便番号データをダウンロードし、[郵便番号]、[都道府県名]、[市区町村名]、[町域名]などのフィールドの値と突き合わせ、いずれかのレコードと高い精度で部分一致した場合は更に番地部分のみを切り出す、といった手法が考えられます。
誤字脱字や表記揺れ、統廃合・改名される前の古い(あるいは新しすぎる)市区町村名が記録されているなどの理由により、住所録データ側のレコードが郵便番号データのどのレコードともマッチしなかった(あるいは複数件候補が見つかった)場合については、前者のレコードを個別に確認して住所を分割、修正するしかないでしょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#9
総合スコア4443
投稿2023/10/19 09:15
編集2023/10/19 09:19すでに指摘されていますが、対象が「全国」ですと、「番地のように見える漢数字を算用数字に直す」といった単純な規則による処理では無理です。
以前の回答もご覧ください (コメントなども)。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#10
総合スコア85785
投稿2023/10/19 09:27
編集2023/10/19 12:23最初の回答に
状況に応じて楽な方法を柔軟に考えるのでしょうか。
と書いたとおりで、たかだか3000件なので、「プログラムでどこまで精度を上げて変換するか」など考えるだけ無駄だと思います。
考えている間に例外をチェックし終わる。
>質問者さん
3000件は多いとお思いかも知れませんが、手作業無しで大丈夫なようなプログラムを作るのは3000件を手作業で例外チェックをする10倍とか100倍くらいの時間が掛かるかと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#11
総合スコア4443
投稿2023/10/20 03:57
既存データが3000件だということで、今後追加されるデータも正規化されているとは限らないわけですから、やはり正規化の方式は考えておかないといけないですね。
郵便物に印字できるカスタマバーコードの仕様では、郵便番号と住所表示番号だけを符号化します。局内バーコードも同様の仕様と思われますが、郵便番号とあて名を文字認識した結果から自動的にバーコードを生成して印字しているということなので、郵便番号を手掛かりに住所表示番号だけを分離することはできるということです (自動処理できなかったものは人間がモニタで確認して手入力)。
すでに提案されている方式の繰り返しですが、おそらく次のようにしています。
たとえば
〒060-0005 北海道札幌市中央区北五条西五丁目二番五号信金中央金庫ビル10F
060-0005は「北海道札幌市 中央区 北五条西(1~24丁目)」を表す郵便番号なので、住所先頭からパターンマッチさせて取り除くと、残った「五丁目…」以降が住所表示番号 (と建物名) です。
建物名を取り除いて住所表示番号を正規化すると、
北海道札幌市中央区北五条西5-2-5-10F
となります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#12
総合スコア85785
投稿2023/10/20 04:36
編集2023/10/20 04:40今後は入力規則に従ってレコードを追加してもらいます
なので、今回一度きりで、今後はまとめての対応は不要のようですが、
追加の際に、入力フォームの変更でそもそも入力できないようにするのか(漢数字番地入力不可)、
紙を見ながら人間がExcelのセル等に全部手入力しているのか(人間の注意力頼り)、
など、追加の方法次第では、「追加データが規則通りかの検証」が必要か不要か違ってきます。
検証不要とするために入力フォームをなんとかするのが良いと思います。
入力フォームもよく考えないと、「番地の手前まで」「番地」「マンション名など」に分割したとしても、
不特定多数の人が入力するなら「一丁目」を「番地の手前まで」と「番地」のどちらに入れるか分かれそうです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#13
総合スコア4443
投稿2023/10/20 06:26
編集2023/10/20 06:53郵便番号データを使うと、「一丁目」などが番地かどうかについての曖昧さはなくなりますね。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#14
総合スコア16
投稿2023/10/24 00:42
可能な限り意図したように変換するには、住所の正規化が必要です。
Excel上で利用できる、Webサービスもあります。
https://excelapi.org/docs/post/address-separate/
しかし、外部にデータを送るのが不可なら、
https://github.com/geolonia/normalize-japanese-addresses
を、ローカルで利用できるようにすれば良いと思います。
けれども、3000件なら、手作業の方が速いと思います。
C#で、Excelのアドインにできないかと、調べたのですが時間がかかりすぎるので、断念しています。
ちなみに、郵便番号から、住所の正規化を行うのは、なかなか難しいと判断しています。
https://ganges.pro/customer/blog/yuubinhelper/
で、解説しましたが、
- 町域名
- 市区町村名
- 県
が異なるけれども、郵便番号は同じなものがいくつもあります。この処理。
郵便番号のデータは、郡が含まれますが、元のデータで、郡が省略されている時の処理。
など、処理することが多いです。
実務上は、
- 都道府県
- 市区町村
- 住所1
- 住所2 (建物など)
の4分割で充分な場合が多く、その場合は、住所1、住所2 の数字を、(1回だけなら)手作業で修正するのが、速いかもしれません。
VBAで分割
https://qiita.com/hiro_t/items/03661ce9478f308041b7
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#15
総合スコア4443
投稿2023/10/24 01:49
編集2023/10/24 06:42郵便番号に基づいて住所を入力することで、入力された住所の正規化処理は省けると思います。
例えば
〒605-0931京都府京都市東山区大和大路通正面西入茶屋町521
があったとき、郵便番号データから605-0931は「京都府京都市東山区茶屋町」に決まり、それに住所表示番号「521」がついたものを正規化された住所とします。
入力された住所そのものの正規化は不要です。
つまり、住所は
- 郵便番号データに基づく住所部分
- 住所表示番号 (いわゆる番地)
- 建物名等 (あれば)
の3要素で表記できます。
補足
上で「いわゆる番地」と書いたものは英数字だけとは限らないことに注意して下さい。
例えば「〒925-0034 石川県羽咋市旭町ユ20番地4」は925-0034が「石川県羽咋市 旭町」なので住所表示番号は「ユ20番地4」あるいは「ユ20-4」です。石川県にはこういうのが多いです (参考)。
また、mikihiro さんが指摘されている、町村や県を跨いで同じ郵便番号が振られる例ですが、例えば370-1600は群馬県上野村と同県神流町のそれぞれの「他に掲載のない場合」となっています。字名のついているような地区には個別に郵便番号が振られており (例えば上野村役場のある大字川和は370-1614)、実際にこの重複番号が使用されるケースはおそらくないと考えます。もしも仮にあったとしても、370-1600については「群馬県 多野郡」とし、「上野村」や「神流町」以降を住所表示番号として扱えばよいと考えます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#16
退会済みユーザー
総合スコア0
投稿2023/10/24 05:03
皆様、回答ありがとうございます。
郵便番号を活用してみます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。