這一年因為工作需求,常常得處理大量Raw Data,從資料庫來的,或是Excel,超過50000筆資料所在多有,因此呢,一個常常得拿出來的好用的工具就一定要分享了。
上頭的影片可以看見Google Refine強大處,不過我這兒想介紹的是另一個應用,也就是將一整串的地址分欄方式。也請注意,本文Geek Only,生人勿入...
首先,下載回來解壓Google Refine,就可以直接執行。執行後會跳出瀏覽器,原因是Google Refine其實是一個包好的Web端應用程序,因此執行後,可發現在瀏覽器的網址為「127.0.0.1:3333」,這就是預設的Google Refine應用程式首頁。
匯入Project / Excel 等照畫面操作,就不多提,以下直接跳到簡單介紹我如何正規化台灣地址,簡而言之,本文的目標就是批次把所有地址如「100台北市中正區天龍路3段253巷1號5樓」,轉變成以下格式:
100 | 台北市 | 中正區 | 天龍路3段253巷1號5樓
1. 將地址欄位去掉空白,郵遞區號去掉
因為呢,Google Map會自動判斷郵遞區號,所以得先把不必要的郵遞區號去掉,我們用Edit Cell裡頭,Transform 搭配正規表達式達成。
Edit Cell -> Transform -> value.trim().replace(/\s/,'').replace(/^\d+/,'')
2. 將縣市名稱換成正確五都名稱,分三次作業
一樣,因為過往的data都有五都問題,得一次清掉解決
Edit Cell -> Transform -> value.replace("臺","台").replace(/^北縣/,"台北縣").replace(/^北市/,"台北市") value.replace(/((台北縣|台中縣|台南縣|高雄縣).+)(市|鄉|鎮)/,'$1區') value.replace("台北縣","新北市").replace("台中縣","台中市").replace("台南縣","台南市").replac e("高雄縣","高雄市")
3. 使用Google Map解析地址成為JSON:
這個方法會開始一個一個地址丟去web爬結果回來,所有JSON都會存成一欄供後續處理
Edit Column -> Add column by fetching urls -> "http://maps.google.com/maps/api/geocode/json?sensor=false&language=zh-tw®ion=tw&address=" + escape(value, "url")
參考:FetchingURLsFromWebServices
參考:Google Map API JSON 解析結果
4. 分別切出郵遞區號、縣市、鄉鎮市區、街道
利用Google Refine內建function parseJson() 來進行這件事情。
參考: 如何使用Google Refine parseJson
Edit Column -> Add column based on this column 郵遞區號: value.parseJson().results[0].address_components[6].long_name 縣市: value.parseJson().results[0].address_components[4].long_name 鄉鎮市區: value.parseJson().results[0].address_components[3].long_name
5. 抽取正確的街道地址
因為Google回傳的街道地址,會自動把「樓」去掉,所以我們得把原始的地址給保留,但去掉縣市、鄉鎮市區。
Edit Column -> Add column based on this column value.replace(cells["縣市"].value,"").replace(cells["鄉鎮市區"].value,"")
以上,是不是輕鬆寫意呢?還有些資訊可供參考、研讀!
一點補充:
如果只是想要把 中正區天龍路3段253巷1號5樓 變成 中正區 | 天龍路3段253巷1號5樓,下面是一個小技巧:
Edit Column -> Add column based on this column value.replace(value.replace(/^.+(鄉|鎮|市|區)/, ""),"")