本篇文章更新時間:2019/02/16
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
這幾天跟客戶拿了他的系統資料庫,要來做資料分析做往後行銷用途。
八千多筆的會員資料在原始資料中,儲存的地址沒有設計,就是最原始的人工輸入,不過這可不行!
直接從資料上看是沒辦法統計出各地區使用人數等分佈資訊
問題還是要解
上網找了一下,看到這篇「用Google Refine + Google Map API 正規化台灣地址」,解法跟我想的差不多,不過令我感興趣的點是 OpenRefine 這個工具,把凌亂的資料用它來整理比 Excel 強大太多拉~~~
會有這種比較純粹是再前一個案子,有個客戶丟了一個人工 Keyin 的數十萬筆資料要整理程式化(覺得汗顏),同時也是因為這樣大量的資料我才知道 Excel 2010 跟 Excel 2013 有個實質上的差異「能處理的資料量」,要2013版才能夠處理到數十萬的資料。
但!凡事總有那個但,如果今天2013能夠整理好我就不會來比較了。
又因為 Excel 2013 不是用 UTF8 處理文字,檔案內的某些中文在轉成 CSV 格式的時候會變「?」號,所以我還是寫了隻程式去讀...
(離題了)
直接總結: 用 OpenRefine 也無法處理那幾十萬筆的 Excel 檔(默)
回到主題
看了 Google Maps API 說明
非商業會員每日請求量是2500筆,考量那八千多筆的資料一定有空的,有錯誤亂打的...等,那些會查到噴錯的可能資料
以最少coding來考慮(簡稱偷懶),就是假設大部分都對,錯誤我再處理
提供程式碼如下(只避開沒填住址的)
include_once('data_array.php');
$file = 'address_format.txt';
$cl = count($custdat);
$add_arr = array();
for ($i=0;$i<$cl;++$i){
$addr = urlencode($custdat[$i]['ADDR']);
if ($custdat[$i]['ADDR']=="")continue;
$g = file_get_contents("http://maps.googleapis.com/maps/api/geocode/json?address=".$addr."&sensor=true&language=zh_TW®ion=tw");
$obj = json_decode($g,true);
if ($obj["status"]!="OK"){
file_put_contents($file, json_encode($add_arr).'@@@@@'.$i.'@@@@@', FILE_APPEND | LOCK_EX);
echo "
ERROR INDEX:".$i."
";
echo $g;
exit;
}
$add_arr[] = array("sid"=>$i,"usid"=>$custdat[$i]['RECNO'],"email"=>$custdat[$i]['EMAIL'],"name"=>$custdat[$i]['CUST_NAME'],"address"=>$obj,"sex"=>$custdat[$i]['SEX']);
echo '
'.$i . ' @ ';
echo $custdat[$i]['ADDR'];
echo ' => ';
echo $obj["results"][0]["formatted_address"];
echo '
';
flush();
ob_flush();
sleep(2);
//exit;
}
file_put_contents($file, json_encode($add_arr).'@@@@@END@@@@@', FILE_APPEND | LOCK_EX);
簡單的邏輯就是
撈地址去查->回來結果等發生錯誤(code 500)就存檔->根據查詢進度改index數值->再跑,從錯誤的下一個地址再查 (如此循環)
其實中斷的次數也不多,放著給他跑,分個幾天就處理完了~
參考資料
OS: Maps 的 API 很常改,查資料看到PO文時間有點距離了還是自己先看看文件會比較保險!