FlashでCSVを読み込む

すごく今さら感ありますが、つまづいたのでメモ。
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;
	}
	
}

Trackbacks

Trackback URL: http://blog.naggg.jp/mt/mt-tb.cgi/69

Comments(3)

いつも参考にさせていただいてます。
一つ質問なのですが、コンストラクタのところで、
this._loader.owner = this;
としているのはなぜなんでしょうか。
たぶんコールバックの概念がよくわかっていないのだと思いますが、
何かヒントをいただけませんでしょうか?

Ryosuke.H さん、どうも。

ちょっと最近AS3がメインなので理由を忘れかけてました、、、すいません。

えと、途中 _loader.onData を定義している箇所がありますよね?
AS2だとこの関数の中でのスコープがズレるんですよ。
_loader.onData 内の this は CSVLoader インスタンスではなくて、_loader プロパティを指すんですよね。なので、_loader → CSVLoader インスタンス、この参照をつなぐために、_loader に owner というプロパティをつけてあげてるってことです。

そこらへん、livedoc にも記事がありますね。
イベントハンドラのスコープ
http://livedocs.adobe.com/flash/9.0_jp/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000846.html

ちなみに、AS3だとこういうスコープのズレは起こらない(起こりづらい)ので楽ちんです。

解説ありがとうございます。
御礼が遅くなりました。
私も職場でAS2を触りつつ、自宅でAS3を勉強しているので、頭がこんがらがりそうです。
イベントでお会いできれば光栄です。
ご健闘お祈りします。

Send Your Comment