在宜蘭縣政府資料開放平台僅提供 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
其中只有 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,以避免後續處理時有亂碼問題;以記事本開啟該檔案。
另存新檔,選擇編碼為 UTF-8,檔案名稱為 HomeStay.csv。
我們將以此檔案上傳到 Google Drive。
連結到 Google Drive,網址:https://www.google.com/drive/ 並且登入您的 Google 帳號,建立一個資料夾名為 Public。
把 HomeStay.csv 檔案上傳到 Public 資料夾。
上傳時可能會出現上傳設定視窗,先取消勾選相關轉換項目,按 [開始上傳]。
在 HomeStay.csv 檔案按滑鼠右鍵,選擇 [共用]。
在 [擁有存取權的使用者] 分類中,選擇 [變更]。
勾選 [公開在網路上],按 [儲存]。
取得共用連結 sharing link
https://drive.google.com/file/d/0B34Keu0W_LIJODdEYUhVSDZIS28/edit?usp=sharing
連結到 Google Drive Direct Lick Geberator,網址:https://sites.google.com/site/gdocs2direct/,透過該網頁功能,取得下載連結:https://docs.google.com/uc?export=download&id=0B34Keu0W_LIJODdEYUhVSDZIS28
Windows Phone 應用程式開發
下載 CSV 資料檔案
新增專案
開啟 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 資料檔案是否成功。
如果你看到像下圖資料呈現亂碼,表示在先前步驟您沒有變更編碼為 UTF-8
異動資料
開啟位於電腦中的 HomeStay.csv 檔案,並且修改一些資料,例如我多加了一筆小歐民宿的資料到裡面。
連結到 Google Drive 在先前上傳的 HomeStay.csv 上按滑鼠右鍵,選擇 [管理修訂版本]。
選擇 [上傳新的修訂版本],選擇本機電腦修改好的檔案進行上傳。
可以看到多了一個新版本。
重新執行應用程式,可以看到資料已經更新。
解析 CSV
由於下載的資料是 CSV 檔案,我們需要解析 CSV 資料並且放進 Items 中,可以使用的套件有很多,在此我使用 KBCsv,網址:http://kbcsv.codeplex.com/,在 Nuget 搜尋即可進行安裝。
一樣在 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["民宿中文地址"]
});
}));
}
}
}
}
執行應用程式,可以看到資料顯示在畫面中。