- loadVariables() : 函數。
- loadVariablesNum() : 函數。
- XML.load() : XML 類別中的方法。
- LoadVars.load() : LoadVars 類別中的方法。
後來才發現,原來在 XML 和 LoadVars 類別中,除了用 load 方法來載入指定的檔案,另外還有 onLoad , onData ...... 等方法,可以用來判斷資料是否載入成功,甚至編寫我們期望的程序,這樣一來,loadVariables() 和 loadVariablesNum() 載入成功否與的問題就可以輕鬆的解決了。
雖然用 .txt 或是 .xml 可以讓使用者塞自訂的題庫給程式,但是對一般人而言,以類似 Windows notepad 的文字編輯器來編寫設定,似乎有的人會有障礙。加上有的人想直接以教科書出版社給的出題光碟直接匯出題庫來用,如何讓 Flash 可以直接讀入 CSV 格式的文字檔來用,也是一個值得探討的主題。
在 Flash 的 LoadVars 、XML 類別中,我們以可以:
- 用 load 來載入指定的檔案。
- 用 onLoad 來判斷是否載入成功,它會在資料載入完成後或是發生錯誤被呼叫。
- 用 onData 來取得載入的原始資料,它會在資料載入完成後或是發生錯誤被呼叫。
下面是解析 CSV 格式文字檔的程式碼:
//先停在這個影格以上面的程式碼讀入 CSV 檔案後,我們可以在下一影格中得到一個名為 records 的二維陣列,裡面暫存的就是經過解析過的 CVS 資料。
//等待 .load 的結果
//再由 .onData 來判斷是否接收到資料, 分解 CSV 檔中的資料
//資料分解完會暫存到 records (二維列陣)中
//資料載入完會跳到下一影格繼續
stop();
//指定要載入的 csv 檔的檔名
//------------------------------------------------------------------------------
csvFilename = "test.csv";
//------------------------------------------------------------------------------
//下面利用 LoadVars Class 中的方法來載入設定檔
//建立一個名為 loadCsv 的物件
loadCsv = new LoadVars();
//如果成功載入,資料會分解並存入 records, 否則 records 會設為 undefined
loadCsv.onData = function(src:String) {
if (src == undefined) {
records = undefined;
} else {
records= src.split("\n"); //以換行將各行分解出來
for(var i=0; i<records.length; i++) {
records[i] = records[i].split(","); //以逗號將各欄位分開
//如果頭尾是雙引號的(字串),將雙引號去掉
for(var j=0; j<records[i].length; i++) {
field = records[i][j];
if(field.substr(0,1) == '"' && field.substr(-1,1) == '"') {
records[i][j] = field.substr(1, field.length-2);
}
}
}
}
gotoAndPlay(_currentframe+1); //跳到下一個影格繼續
};
loadCsv.load(csvFilename); //載入檔案
上面的解析程式其實並不完整,如果遇到資料是帶有換行字元、雙引號、逗號......等時,就可能產生解析錯誤的情形。不過,目前已經足以應付一般需求了,有空再來研究如何讓它更完備。
參考資料
CSV - 維基百科,自由的百科全書 http://zh.wikipedia.org/zh-hk/CSV
- RFC 4180
http://tools.ietf.org/html/rfc4180
沒有留言:
張貼留言