[Windows Phone] 開發宜蘭縣政府資料開放平台應用程式 (1) 透過 Google Drive 放置宜蘭縣政府資料開放平台 CSV 檔案進行讀取

在宜蘭縣政府資料開放平台僅提供 CSV 檔案做為資料來源,但對於 Windows Phone 應用程式而言,如果將 CSV 檔案直接包在應用程式中,日後要更新資料則必須重新封裝應用程式並且發佈到市集,本文參考微軟最有價值專家當麻的做法,透過 Google Drive 放置宜蘭縣政府資料開放平台 CSV 檔案進行讀取。

 

本文參考微軟最有價值專家當麻的作法,網址:http://no2don.blogspot.com/2013/10/windowsphone-server.html

 

前言

指導的學生參與技術達人來挑戰活動,其中有題目是宜蘭縣政府資料開放平台,以宜蘭縣民宿名冊而言,資料網址如下所示:

http://opendata.e-land.gov.tw/OpenData/Display.aspx?guid=1de99984-1f70-410a-9b50-125879f104ff

image

 

其中只有 CSV 檔案可以下載,並無開放資料介接網址可以直接使用,如果將 CSV 檔案直接包在 Windows Phone 專案中,日後想要更新相關資訊,則需要重新封裝和上架到市集。

我個人先前是採用 DropBox 來放置檔案,但 DropBox 免費帳戶有限制流量的問題。

微軟最有價值專家當麻有提供一種做法,是將檔案放到 Google Drive 中,讓 Windows Phone 應用程式下載與讀取,文章的網址:http://no2don.blogspot.com/2013/10/windowsphone-server.html

本文將撰寫一個範例,將宜蘭縣民宿資料放置在網路磁碟作為資料介接,讓 Windows Phone 應用程式讀取檔案並且顯示。

 

將 CSV 資料檔案放置到 Google Drive 並取得下載連結

先從宜蘭縣政府資料開放平台,下載宜蘭民宿名冊的 CSV 檔案下載,先做變更編碼為 UTF-8,以避免後續處理時有亂碼問題;以記事本開啟該檔案。

image

 

另存新檔,選擇編碼為 UTF-8,檔案名稱為 HomeStay.csv。

image

 

我們將以此檔案上傳到 Google Drive。

image

 

連結到 Google Drive,網址:https://www.google.com/drive/ 並且登入您的 Google 帳號,建立一個資料夾名為 Public。

image

 

把 HomeStay.csv 檔案上傳到 Public 資料夾。

image

上傳時可能會出現上傳設定視窗,先取消勾選相關轉換項目,按 [開始上傳]。

image

 

在 HomeStay.csv 檔案按滑鼠右鍵,選擇 [共用]。

image

 

在 [擁有存取權的使用者] 分類中,選擇 [變更]。

image

 

勾選 [公開在網路上],按 [儲存]。

image

 

取得共用連結 sharing link

https://drive.google.com/file/d/0B34Keu0W_LIJODdEYUhVSDZIS28/edit?usp=sharing

image

 

連結到 Google Drive Direct Lick Geberator,網址:https://sites.google.com/site/gdocs2direct/,透過該網頁功能,取得下載連結:https://docs.google.com/uc?export=download&id=0B34Keu0W_LIJODdEYUhVSDZIS28

image

 

Windows Phone 應用程式開發

下載 CSV 資料檔案

新增專案

SNAGHTML2187f04

 

開啟 MainViewModel.cs,將 LoadData() 方法修改為


        /// <summary>
        /// 建立並加入一些 ItemViewModel 物件到 Items 集合。
        /// </summary>
        public void LoadData()
        {
            HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("https://docs.google.com/uc?export=download&id=0B34Keu0W_LIJODdEYUhVSDZIS28");
            httpWebRequest.BeginGetResponse(new AsyncCallback(GetHttpDocumentCallback), httpWebRequest);

            this.IsDataLoaded = true;
        }

 

新增 GetHttpDocumentCallback 方法


        private void GetHttpDocumentCallback(IAsyncResult iAsyncResult)
        {
            HttpWebRequest httpWebRequest = (HttpWebRequest)iAsyncResult.AsyncState;
            HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.EndGetResponse(iAsyncResult);
            using (StreamReader responseStream = new StreamReader(httpWebResponse.GetResponseStream()))
            {
                string stream = responseStream.ReadToEnd();
                if (string.IsNullOrEmpty(stream))
                {
                    return;
                }
            }
        }

 

設定中斷點,檢視下載 CSV 資料檔案是否成功。

image

 

如果你看到像下圖資料呈現亂碼,表示在先前步驟您沒有變更編碼為 UTF-8

image

 

異動資料

開啟位於電腦中的 HomeStay.csv 檔案,並且修改一些資料,例如我多加了一筆小歐民宿的資料到裡面。

image

 

連結到 Google Drive 在先前上傳的 HomeStay.csv 上按滑鼠右鍵,選擇 [管理修訂版本]。

image

 

選擇 [上傳新的修訂版本],選擇本機電腦修改好的檔案進行上傳。

image

 

可以看到多了一個新版本。

image

 

重新執行應用程式,可以看到資料已經更新。

image

 

解析 CSV

由於下載的資料是 CSV 檔案,我們需要解析 CSV 資料並且放進 Items 中,可以使用的套件有很多,在此我使用 KBCsv,網址:http://kbcsv.codeplex.com/,在 Nuget 搜尋即可進行安裝。

SNAGHTML2854f47

 

一樣在 MainViewModel.cs 做修改,先 using namespace。

 


using Kent.Boogaart.KBCsv;

 

將 GetHttpDocumentCallback 方法做修改,原本是將下載的資料流放到字串中,改為使用 CsvReader 類別解析,並且將資料塞進 Items 各個屬性中。

 


        private void GetHttpDocumentCallback(IAsyncResult iAsyncResult)
        {
            HttpWebRequest httpWebRequest = (HttpWebRequest)iAsyncResult.AsyncState;
            HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.EndGetResponse(iAsyncResult);
            using (StreamReader responseStream = new StreamReader(httpWebResponse.GetResponseStream()))
            {
                //string stream = responseStream.ReadToEnd();
                //if (string.IsNullOrEmpty(stream))
                //{
                //    return;
                //}
                using (var reader = new CsvReader(responseStream))
                {
                    reader.ReadHeaderRecord();

                    while (reader.HasMoreRecords)
                    {
                        var record = reader.ReadDataRecord();
                        Deployment.Current.Dispatcher.BeginInvoke(new Action(() =>
                         {
                             this.Items.Add(new ItemViewModel()
                             {
                                 LineOne = record["中文名稱"],
                                 LineTwo = record["聯絡電話"],
                                 LineThree = record["民宿中文地址"]
                             });
                         }));
                    }
                }
            }
        }

 

執行應用程式,可以看到資料顯示在畫面中。

SNAGHTML2861f2a

 

範例下載

HomeStayApp.zip