質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

3615閲覧

正規表現で住所を分解する方法

ayu

総合スコア212

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2016/02/14 09:26

編集2016/02/14 10:33

こんばんわ。

今回は正規表現で、データを登録する際に分解して、データを取得したいです。
対象となる「住所」を「都道府県」+「大枠地域」に分解したいです。
「大枠地域」に関しては、「気象庁の一次細分区分」になります。
詳細は下記になります。
http://www.jma.go.jp/jma/kishou/know/yougo_hp/shichoson_ichiran.html

https://gyazo.com/7891199cd663946a52568fd4ef5ca146

例になります。

東京都立川市・・・(住所) ->東京都(都道府県)/東京地方(大枠地域) 北海道旭川市・・・(住所) ->北海道(都道府県)/上川地方(大枠地域) 「住所」 →「都道府県」「大枠地域」に変換

このように正規表現で変換をして、住所を取りたいのですが、大枠が莫大な量になるので、何かいい方法はありますでしょうか。

データとして、「都道府県」+「大枠地域」のデータはあります。
「住所」という、ただの文字列から「都道府県」+「大枠地域」に変換という作業です。

考えが思いつかなかったので、質問させていただきましたm(_ _)m

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikeyan

2016/02/14 10:16

「大枠地域」というものの定義は持っていますか? 例えば旭川市が「上川地方」という大枠地域に属することをどうやって知りましたか?
ayu

2016/02/14 10:33

わかりにくくて申し訳ございませんでした。 「大枠地域」という概念は気象庁の「一次細分区域」になります。 URL等は本文に書いてあります。
guest

回答2

0

ベストアンサー

Webサイトから情報をjavascriptで抜き出せば良いと思います。
これをスクレイピングといいます。
例えば、上の一次細分区域のページを開いて、情報が書いてあるテーブルを右クリックすると、「検証」とか「要素の検査」とか「要素を調査」とか、ブラウザによりますがそのようなメニューが出てくると思いますのでクリックしてください。
そうするとページのHTML構造が表示されます。
また、「コンソール」という部分をクリックするとjavascriptで好きなプログラムを実行して結果を見ることが出来ます。
これを利用すれば、「一次細分区域」に対応する全ての「二次細分区域の名称」を取得できます。
まあ、一部に注*がありますが、大体は市区町村のようなので、なんとかなると思います。

以下、注を処理しないデータを取ってみたので参考にしてみてください。

javascript

1var $table = $('.data2').eq(0); 2var $trs = $table.find('tr'); 3var primarySubdivision = null; 4var prefecture = null; 5var result = {}; 6for (var i = 1; i < $trs.length; ++i) 7{ 8 var $tds = $trs.eq(i).children('td'); 9 if ($tds.length > 2) { 10 primarySubdivision = $tds.eq($tds.length - 3).text(); 11 } 12 if ($tds.length > 3) { 13 prefecture = $tds.eq($tds.length - 4).text(); 14 } 15 if (i <= 46) { 16 prefecture = "北海道"; 17 } 18 if (i >= 362) { 19 prefecture = "沖縄県"; 20 } 21 $tds.eq($tds.length - 1).text() 22 .split("、") 23 .forEach(function (secondarySubdivision) { 24 result[prefecture + secondarySubdivision] = primarySubdivision; 25 }); 26} 27console.log(result); 28JSON.stringify(result, null, 2);

出力は以下のようになります。

JSON

1{ 2 "北海道稚内市": "宗谷地方", 3 "北海道猿払村": "宗谷地方", 4 "北海道豊富町": "宗谷地方", 5 "北海道幌延町": "宗谷地方", 6(...中略...) 7 "沖縄県与那国町": "与那国島地方" 8}

投稿2016/02/14 11:07

編集2016/02/14 12:31
ikeyan

総合スコア136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ayu

2016/02/14 13:42

具体的なコードありがとうございます。 大変助かりました!
guest

0

Qiita にて住所から正規表現を使って都道府県などをキャプチャする記事があったので貼っておきます。
「大枠地域」についてはハッシュテーブルなどを作成した上で取り出すしかないと思われます。

参考:
なるべく短い正規表現で住所を「都道府県/市区町村/それ以降」に分けるエクストリームスポーツ - Qiita

投稿2016/02/14 10:47

chitoku

総合スコア1610

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ayu

2016/02/14 13:42

こういうやり方もあるんですね。 マッチ率まで書いているなんて・・・ ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問