2010年6月5日 星期六

Flash : 以 LoadVars 載入 CSV 格式的檔案

自從開始以 Flash 來設計可以應用於教學的各種小工具及遊戲,一直僅守著可以讓使用者依需求自訂選項或題庫的原則,這樣才可以讓它發揮最大的價值。在 Flash 中,讀取 .txt 或是 .xml 的設定檔可以用下面的方法:
  • 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 格式文字檔的程式碼:
//先停在這個影格
//等待 .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 檔案後,我們可以在下一影格中得到一個名為 records 的二維陣列,裡面暫存的就是經過解析過的 CVS 資料。
上面的解析程式其實並不完整,如果遇到資料是帶有換行字元、雙引號、逗號......等時,就可能產生解析錯誤的情形。不過,目前已經足以應付一般需求了,有空再來研究如何讓它更完備。

參考資料

沒有留言:

張貼留言

 
© 2009. Design by Pocket