すごく今さら感ありますが、つまづいたのでメモ。
Flash ネイティブの LoadVars クラスを委譲して、CSV を読み込み解析するクラスを作ってみたんですが、LoadVars.onLoad でハマってました。
結論言うとこうなんですね。
・LoadVars.onLoad は読込データの解析が完了したときのイベント
・LoadVars.onData はデータ読込み完了のイベント
なるほど。
Flashやってずいぶん経ちますが今まで気づかなかった・・・org
・URLエンコードしたテキストデータ → LoadVars.onLoad
・生テキストデータ(CSV含む) → LoadVars.onData
ってことですね。
AS3だと明示的に指定できるみたいで、やっぱよく考えられてるなぁと。
外部ドキュメントからのデータのロード ~ 外部データの操作 -- Flex 2
Apollo でさくっと CSV エディタとか作れそうな予感。。
class CSVLoader{
var data:Array;
private var _loader:LoadVars;
private var _onLoad:Function;
function CSVLoader(){
this.data = new Array();
this._loader = new LoadVars();
this._loader.owner = this;
}
/**
* CSVファイルの読込
* @param url 対象ファイルのURI
*/
function load(url:String){
// ロード時の処理がなければ強制的に設定
if(!_onLoad){onLoad = null;}
// ロード開始
_loader.load(url);
}
/**
* CSV読込時に呼ばれるコールバック
*/
function set onLoad(f:Function){
_onLoad = f;
_loader.onData = function(src:String){
var success:Boolean = Boolean(src);
if(success){
this.owner.data = this.owner._parseCSV(src);
}
this.owner._onLoad(success);
}
}
function get onLoad():Function{
return _onLoad;
}
/**
* CSVデータをパースして多重配列に
*/
private function _parseCSV(rawdata:String):Array{
// 改行コードの差異をなくしすべて \n に
rawdata = (rawdata.split("\r\n")).join("\n");
rawdata = (rawdata.split("\r")).join("\n");
// CSVを多重配列に
var data:Array = new Array();
var tmp:Array = rawdata.split("\n");
var l:Number = tmp.length;
for(var i:Number=0; i<l; i++){
data.push(tmp[i].split(","));
}
// 最終行が空白ならば削除しておく
if(data[data.length-1].length == 1 && data[data.length-1][0] == ""){data.pop();}
// 戻す
return data;
}
/**
* 文字列への変換
*/
function toString():String{
var s:String = "[CSVLoader]\n";
for(var i:Number=0; i<data.length; i++){
s += " ["+i+"] " + data[i] + "\n";
}
return s;
}
}