使用 Google Maps API 格式化地址

這幾天跟客戶拿了他的系統資料庫,要來做資料分析做往後行銷用途。

八千多筆的會員資料在原始資料中,儲存的地址沒有設計,就是最原始的人工輸入,不過這可不行!

直接從資料上看是沒辦法統計出各地區使用人數等分佈資訊

問題還是要解

上網找了一下,看到這篇「用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&region=tw");
    $obj = json_decode($g,true);
    if ($obj["status"]!="OK"){
        file_put_contents($file, json_encode($add_arr).'@@@@@'.$i.'@@@@@', FILE_APPEND | LOCK_EX);
        echo "<br /><br />ERROR INDEX:".$i."<br/>";
        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 '<br />'.$i . ' @ ';
    echo $custdat[$i]['ADDR'];
    echo ' => ';
    echo $obj["results"][0]["formatted_address"];
    echo '<br />';
    flush();
    ob_flush();
    sleep(2);
    //exit;

}
file_put_contents($file, json_encode($add_arr).'@@@@@[email protected]@@@@', FILE_APPEND | LOCK_EX);

簡單的邏輯就是

撈地址去查->回來結果等發生錯誤(code 500)就存檔->根據查詢進度改index數值->再跑,從錯誤的下一個地址再查 (如此循環)

其實中斷的次數也不多,放著給他跑,分個幾天就處理完了~

參考資料

  1. Google Maps API

OS: Maps 的 API 很常改,查資料看到PO文時間有點距離了還是自己先看看文件會比較保險!

Facebook 外掛功能


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[//////////____30%_________]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *