iT邦幫忙

0

關於MySQL 正則表達式 地址 路跟里

  • 分享至 

  • xImage

最近使用MYSQL來拆解地址
本想說都很順的都能拆解 但是後面在檢查一些配對的資料發現
台中市有個六路里 我本來的思路是 將 縣市鄉鎮區路里 ... 後面加| 變成縣|市|再去做計算
但是目前這個思路會將地址拆成
"六路" 跟 "里" 想請教一下 RE該如何下 感謝各位

#11/23 更新一下 辛苦各位了

我不確定stored procedure能不能做到這點
我的思路是想說逐行逐字去判斷 然後@str是每行每字去判斷
如果@str有包含縣市鄉鎮等字 而且長度大於2那就直接update到欄位裡
如果@str沒有包含的話 那就持續將@str的字串再一起併放到tmp裡面

只是我這樣寫 會變成只會update 最後一行的最後找到的tmp然後更新到每個欄位 變成每個欄位都是一樣的值

該如何修改比較好

DROP PROCEDURE
IF
	EXISTS Caculator;

DELIMITER $$
CREATE PROCEDURE `Caculator` () BEGIN
	DECLARE
		i INT DEFAULT 1;
	DECLARE
		tmp CHAR ( 80 ) DEFAULT "";
	
	SET SQL_SAFE_UPDATES = 0;
	UPDATE addr 
	SET 地址 = REPLACE ( REPLACE ( sys.addr.地址, "【", "(" ), "】", ")" ),#在取出()內的文字包括括號
	註釋 = substring_index( substring_index( REGEXP_SUBSTR ( sys.addr.地址, '[(].*[)]' ), ")", "1" ), "(",- 1 ),
	計算地址 = substring_index(地址, "(", "1" );
	SELECT
		@STRlen := char_length( `計算地址` ) 
	FROM
		addr;
	loop_name :
	LOOP
		IF
			i > @STRlen THEN-- 迴圈開始
				LEAVE loop_name;
			
		END IF;
		SELECT
			@str,
			SUBSTR( `計算地址`, i, 1 ) 
		FROM
			addr;
		
		SET tmp = CONCAT( tmp, @str );
		IF
			@str IN ( '縣', "市", "鄉", "鎮", "區", "路", "街", "段", "巷", "弄", "號", "樓" ) 
			AND char_length( tmp ) > 2 THEN
				UPDATE addr 
				SET `縣市` = ( CASE WHEN @str = '縣' OR @str = '市' THEN tmp END ),
				`鄉鎮區` = ( CASE WHEN @str = '鄉' OR @str = '鎮' OR @str = '區' THEN tmp END ),
				`路街` = ( CASE WHEN @str = '路' OR @str = '街' THEN tmp END ),
				`段` = ( CASE WHEN @str = '段' THEN tmp END ),
				`巷` = ( CASE WHEN @str = '巷' THEN tmp END ),
				`弄` = ( CASE WHEN @str = '弄' THEN tmp END ),
				`號` = ( CASE WHEN @str = '號' THEN tmp END ),
				`樓` = ( CASE WHEN @str = '樓' THEN tmp END );
			
			SET tmp = "";
			
		END IF;
		
		SET i = i + 1;
		
	END LOOP loop_name;-- 迴圈结束
	SELECT
		tmp,
		@str;-- 印出結果
	
END $$DELIMITER;
CALL Caculator ();

johncoc iT邦新手 3 級 ‧ 2022-11-22 11:04:05 檢舉
如果要分很細的話,建議用經緯度去呼叫API抓 縣市鄉鎮區路里 會比較好
不明
【**此則訊息已被站方移除**】
上面的該飛了。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
3
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2022-11-22 21:17:25
最佳解答

其實我早期有研究過。
但我們台灣有些地址太過奇特。
導致用正則能解析的只有約80%左右的路名。

我自已是去下載中華郵政的路名表。
用表對應來處理的。
放棄了用正則來分析路名。

看更多先前的回應...收起先前的回應...
win895564 iT邦新手 1 級 ‧ 2022-11-22 21:48:12 檢舉

是這樣說沒錯 目前能做到也是大概百分之八十
就是想說像這類比較特別的路名 能否有解決方法

我之前研究很長一段時間。
除了你說到的六路里。
還有「五路一街」的、村啥沒路的、島的。里啥路的、六村里啥的。
總之....我研究許多種寫法後。
只有表對應是最沒事的。

先說我之前最後的做法。
就是將一些特定名稱建表對應處理。

如你說到的「六路里」就將分成一個對應表。
但整理下來也約好幾10個。而且還得要寫多重規則來對應。
還不一定準確,太累了。
但也因為後面是想到詞對應後,就決定用路名表對應。
原本要拿GEO資料的。但實在太大。
後來發現中華郵政那邊有提供資料對應。(還連帶有區碼的對應)
就直接下載回來當表對應用了。

win895564 iT邦新手 1 級 ‧ 2022-11-23 10:08:46 檢舉

了解 看起來真的是需要一個對應表 我再來研究看看 感謝你 !

ckp6250 iT邦好手 1 級 ‧ 2022-11-23 11:17:38 檢舉

㊣浩瀚星空㊣
請教,您指的【中華郵政的路名表】,有連結嗎?
到中華郵政網站上一看,可下戴的東西密密麻麻,不知道是那一個?
感恩。

地址不會有正則...因為人性跟政治考慮= =..

ckp6250
直接給你下載連結。
https://www.post.gov.tw/post/download/Zip32_11106.zip
這是 EXCEL 。看情況是 111-06 出來的。

我那是是將其再寫成多重json檔案處理的。
也可以順便做成地址選擇器跟 3+2 區碼的處理。

ckp6250 iT邦好手 1 級 ‧ 2022-11-24 05:20:40 檢舉

㊣浩瀚星空㊣
十分感恩。

它沒有村里,若是用於一般公司地址是沒問題,但如果是【戶籍地址】的話,沒有村里就不太足夠,這部份,您是如何處理嗎?

或者,一半用選的,一半用手打?但,村里是夾在【鄉鎮市區】和【原始路名】二者之間,半選半打,又不太順手。

學這邊
https://www.post.gov.tw/post/internet/Postal/index.jsp?ID=207

處理。

村里其實我是另外處理的。
那邊雖然有提供村里。但只有中英對照。沒有跟對應的縣市對應。

一般如果不需要區碼的話。
我最多下拉到路而已。後面就用打字的。

但如果需要 3+2 區碼。
就變成要全部格式了

0
海綿寶寶
iT邦大神 1 級 ‧ 2022-11-22 11:38:22

地址的正則表示式
可參考這篇

前面的問題都沒有選最有幫助解答
是代表問題都沒解決嗎?

看更多先前的回應...收起先前的回應...
win895564 iT邦新手 1 級 ‧ 2022-11-22 11:45:01 檢舉

大大感謝你 因為前面大家都太熱烈了 選不出最佳解答

如果問題已經解決了
就選個「你認為對你最有幫助」的答案
以免晚來看到問題的邦友
花不必要的時間回答該問題

win895564 iT邦新手 1 級 ‧ 2022-11-22 11:49:42 檢舉

了解 明白了

player iT邦大師 1 級 ‧ 2022-11-22 13:23:43 檢舉

好奇怪?
那篇的規則拿到這個工具去測
https://www.codeproject.com/Articles/9099/The-30-Minute-Regex-Tutorial
跑不出來?

改這樣用?

(?<city>\D+?[縣市])(?<region>\D+?(市區|鎮區|鎮市|[鄉鎮市區]))?(?<village>\D+?[村里])?(?<neighbor>\d+[鄰])?(?<road>\D+?(村路|[路街道段]))?(?<section>\D?段)?(?<lane>\d+巷)?(?<alley>\d+弄)?(?<no>\d+號?)?(?<seq>-\d+?(號))?(?<floor>\d+樓)?(?<others>.+)?
0
kinhp
iT邦新手 5 級 ‧ 2022-11-22 20:27:44

地址的正則表示式
可以看這個
https://github.com/arters/TaiwanAddressNER

解析台灣地址

win895564 iT邦新手 1 級 ‧ 2022-11-22 21:48:31 檢舉

感謝大大 我再來研究看看

player iT邦大師 1 級 ‧ 2022-11-23 10:29:31 檢舉

PHP用的?把規則拿到.NET Framework時,不能直接用?
改成

^(?<zipcode>\d{5}|\d{3})?\s?(?<city>\D+?[縣市])?(?<Township>\D+?[鄉鎮市])?(?<District>\D+?[區])?(?<Village>\D+?[村里])?(?<Neighborhood>.+[鄰])?(?<Road>.+[路])?(?<Street>.+[街])?(?<Boulevard>.+[道])?(?<Section>.+[段])?(?<Lane>.+[巷])?(?<Alley>.+[弄衖])?(?<Number>.+[號])?(?<Floor>.+[樓])?(?<Room>.+[室])?(?<others>.+)$

我要發表回答

立即登入回答