最近使用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 ();
其實我早期有研究過。
但我們台灣有些地址太過奇特。
導致用正則能解析的只有約80%左右的路名。
我自已是去下載中華郵政的路名表。
用表對應來處理的。
放棄了用正則來分析路名。
是這樣說沒錯 目前能做到也是大概百分之八十
就是想說像這類比較特別的路名 能否有解決方法
我之前研究很長一段時間。
除了你說到的六路里。
還有「五路一街」的、村啥沒路的、島的。里啥路的、六村里啥的。
總之....我研究許多種寫法後。
只有表對應是最沒事的。
先說我之前最後的做法。
就是將一些特定名稱建表對應處理。
如你說到的「六路里」就將分成一個對應表。
但整理下來也約好幾10個。而且還得要寫多重規則來對應。
還不一定準確,太累了。
但也因為後面是想到詞對應後,就決定用路名表對應。
原本要拿GEO資料的。但實在太大。
後來發現中華郵政那邊有提供資料對應。(還連帶有區碼的對應)
就直接下載回來當表對應用了。
了解 看起來真的是需要一個對應表 我再來研究看看 感謝你 !
㊣浩瀚星空㊣
請教,您指的【中華郵政的路名表】,有連結嗎?
到中華郵政網站上一看,可下戴的東西密密麻麻,不知道是那一個?
感恩。
地址不會有正則...因為人性跟政治考慮= =..
ckp6250
直接給你下載連結。
https://www.post.gov.tw/post/download/Zip32_11106.zip
這是 EXCEL 。看情況是 111-06 出來的。
我那是是將其再寫成多重json檔案處理的。
也可以順便做成地址選擇器跟 3+2 區碼的處理。
㊣浩瀚星空㊣
十分感恩。
它沒有村里,若是用於一般公司地址是沒問題,但如果是【戶籍地址】的話,沒有村里就不太足夠,這部份,您是如何處理嗎?
或者,一半用選的,一半用手打?但,村里是夾在【鄉鎮市區】和【原始路名】二者之間,半選半打,又不太順手。
學這邊
https://www.post.gov.tw/post/internet/Postal/index.jsp?ID=207
處理。
村里其實我是另外處理的。
那邊雖然有提供村里。但只有中英對照。沒有跟對應的縣市對應。
一般如果不需要區碼的話。
我最多下拉到路而已。後面就用打字的。
但如果需要 3+2 區碼。
就變成要全部格式了
地址的正則表示式
可參考這篇
前面的問題都沒有選最有幫助解答
是代表問題都沒解決嗎?
如果問題已經解決了
就選個「你認為對你最有幫助」的答案
以免晚來看到問題的邦友
花不必要的時間回答該問題
了解 明白了
好奇怪?
那篇的規則拿到這個工具去測
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>.+)?
地址的正則表示式
可以看這個
https://github.com/arters/TaiwanAddressNER
解析台灣地址
感謝大大 我再來研究看看
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>.+)$