前陣子,因為前公司需要,要整理公司客戶們填寫的地址,以方便工程師將整理過的地址放到資料庫中
但如果單純的用資料剖析似乎又不那麼的足夠
因為有需要整理台灣地址的捧友們
有定有發現台灣地址邏輯之複雜
例:新北市淡水區屯山里六塊厝1鄰1號-1
啥米!!!這地址沒有街、路
所以這篇我想跟大家分享我的處理方式與作法
Part I 計算各關鍵字,如「路、街…」出現的位置
第一件事 出發總要有範例,我們就用下圖的範例來練習吧!
第二件事 我們先在資料後方新增下列欄位(這是要用來設定資料抓取區間用的)
接著,我們就要來下公式了,因為前面的公式都一樣,只是選擇範圍不同,所以我就先截局部的畫面,並以直式的方式顯示,這樣你們就能比較容易的觀看公式
這裡我運用到的函數有:
(1)IFERROR:這個公式的用途是,當我們原本的公式找不到資料時會出現#VALUE的畫面,這樣的文字不太利於表格的閱讀,如果我們希望#VALUE可以用0或是用空格代替,那我們就會需要用到IFERROR的公式
他的語法是:IFERROR(判斷的公式,希望爆錯時的顯示方式),這裡前半部的範例顯示的部份我設定為「0」,後半部設定為「""表空格」,這樣找不到資料時該儲存格就會以0或空白顯示了
(2)FIND:尋找某個儲存格中,出現的資料在哪一個位置(這個公式你也可以用search替代喔!而二者的差異,之前查的印象是byte的計算方式不同)
我的用法是(以道為例):=FIND(E$1,$B2,1)
-E$1指的是「道」這個文字的所在,而E的部份我沒加$是因為,等我公式建立好後,會直接複製公式到後面的欄位,當E在沒有鎖定的狀況下,Excel在我複製公式到其它欄時會聰明的幫我把E變成F、G欄…類推。
公式中譯: =find(要找的字,在哪個儲存格裡找資料,從目標的第幾個字開始找)
.$B2呢?就是我要找字的主要目標,看到這裡聰明的你,知道我2的前面為什麼沒加$嗎?(請在留言處回答喔!當然你也可以不理我啦~~~
.最後一個1呢?指的是要從目標B2儲存格中的第幾個位置後開始找E1出現的字,所以假設我有一個目標儲存格的內容是1022181111的數字,前面的102代表的是年度,是我不需要的資料,我希望Excel可以從第4碼開始幫我找第一個出現的1, 那我的公式就要這樣下Find("1",1022181111,4),這樣,他就會回覆你從第4位開始找,第一個出現的1是在第5個字元的位置。
(3)MAX:這個的語法很簡單,就是MAX(要找資料的範圍),Excel就會依據你選擇的範圍去找出最大值
公式都設定完成後,你會得到像下圖的結果
Part Ⅱ 依據關鍵字位置抓取需要的地址資訊
接著,就要進入正題了,我會用上圖取得各關鍵字的所在位置,去抓取我需要的資料值,公式在上方直式圖示的20-27列
這裡我所用到的函數有left和mid
(1)left:這個函數指的是從目標儲存格中的左邊開始抓字
公式中譯: =left(目標儲存格,抓幾個字)
以文中的範例來說,還記得我們在Part I有去計算關鍵字所在的位置嗎?
所以這裡的抓幾個字,就去抓關鍵字出現的位置編號就行了,
例:路名,以第二筆資料來說,「道」這個字出現在第6個位置,那我們只要讓公式指向B3,然後抓6個字,鏘鏘Excle就可以幫我把「凱達格蘭大道」這六個字抓出來了。
(2)mid:這個函數和left是同一家族的孩子,但他是從目標儲存格的中間抓取資料用的
公式中譯: =mid(目標儲存格,從第幾個字開始抓,要抓幾個字)
我們一樣以第二筆為範例來說明,
這次呢?
我希望Excel可以把287號抓出來,
這樣我就必須要知道號在目標儲存格裡的第幾個位置(從Part I可知,號出現在第10個字),
但問題來了,號在第10個字,那這樣我不就抓不到號前面的值了,
所以,我在號之前出現的鄰巷弄後多加了一個「取最大值」的欄位,
去計算在號之前最後一個資料出現在目標儲存格中的哪個位置,
在取得了6之後,「從第幾個字開始抓」的答案就出來了,
但細心的你一定會發現我在公式裡多了一個「+1 」,
原因是最後抓到的字是在第6個位置,可是我要從第7個位置開始抓資料呀,不然結果會變成「道287號」了!
接著,我們該抓幾個字出來呢?我這裡用的公式是「N3-M3」也就是用「號」所在位置 減掉 前面的最大值,這樣會得到10-6=4,我們就請Excle抓四個字出來給我,答案就會顯示為「287號」了!
這樣拆解下來,地址是不是就比較好處理了呢?
大致上的邏輯如上說明,其餘鄰、巷…等的資料抓取方式,就大同小異了,希望能幫助大家快速完成地址資料的抓取喔!