過去にActionScriptにてCSVファイルを読み込む方法を書いた記事があるのですが、問題があることを発見したので、ここにて修正します。
前記事
http://ameblo.jp/kind1010/entry-10052042749.html
前の記事のソースコードでCSVを読み込んだ場合、LoadVarsがサーバーとのやり取りを終了する前に次の処理に移行してしまいます。
たとえば、onDataイベントハンドラの適当なところと、loadメソッドを呼び出した後にtrace文を入れると、処理速度の関係でloadメソッドの後のtrace文の方がonDataイベントハンドラのtrace文より早く出力されます。
出力結果
っとまぁこんな感じになってしまうので、読み込み処理が終わるのを待たねばならんのですよ。
その方法として、読み込みだけで1つのフレームを使用した上で処理前に停止させ、処理が終了したら再生をつづけるという手法をつかいます。(他にももっと効率のいい方法はあるかもしれませんが、私にはワカラナイ)
ってことでその方法で問題に(多分)対応したソースです。
これを1つのフレームに書いて、読み込んだデータの使用は次のフレームから行ってください。
大きな違いは1行目でMCを一度停止させ、38行目で処理の終了によってMCが再生されるまで待っているところです。
MCは42行目で与えてますが、これは後々クラス化しようと思ってこうしただけで、38行目で直接指定してもこの場合は構いません。
あと、ちょっと変更して35行目あたりで値をグローバル変数data_inに2次元配列で代入してます。別にデータ形式は自由にしていただいてもなんら問題はありません。
これなら安定してCSVファイルも読み込めるかと。ただやっぱり「"」の処理を行ってないので、それだけは何とかしないとなぁと思います。
前記事
http://ameblo.jp/kind1010/entry-10052042749.html
前の記事のソースコードでCSVを読み込んだ場合、LoadVarsがサーバーとのやり取りを終了する前に次の処理に移行してしまいます。
たとえば、onDataイベントハンドラの適当なところと、loadメソッドを呼び出した後にtrace文を入れると、処理速度の関係でloadメソッドの後のtrace文の方がonDataイベントハンドラのtrace文より早く出力されます。
lv = new LoadVars();
lv.onData = function (src) {
// ファイルを読み込んでから・・・
trace("onData handler");
};
lv.load("filename.csv");
// その後の処理をして欲しい
trace("After load method");
出力結果
After load method
onData handler
っとまぁこんな感じになってしまうので、読み込み処理が終わるのを待たねばならんのですよ。
その方法として、読み込みだけで1つのフレームを使用した上で処理前に停止させ、処理が終了したら再生をつづけるという手法をつかいます。(他にももっと効率のいい方法はあるかもしれませんが、私にはワカラナイ)
ってことでその方法で問題に(多分)対応したソースです。
this.stop(); // 一度MCを停止させる
// 文字列の置換
function replaceStr(in_str, from_str, to_str) {
str_array = in_str.split(from_str);
return str_array.join(to_str);
}
// 改行コード置換用
System.useCodepage = true; // SJISで読み込む
var CR = String.fromCharCode(13);
var LF = String.fromCharCode(10);
_global.data_in = new Array();
csv_data = new LoadVars();
// データを取得
csv_data.onData = function (src) {
if (src != undefined) {
// 改行コードを揃える
src = replaceStr(src, CR + LF, CR);
src = replaceStr(src, LF, CR);
// 行に分割
cols = src.split(CR);
// 1行ずつ読み込み(ヘッダを飛ばす)
for (i=1; i < cols.length; i++) {
// 要素に切断
rows = cols[i].split(",");
// 取得した値の代入
_global.data_in.push(rows);
}
} else {
trace("Error:データが読めなかった");
}
//停止させたMCを再生させる
this.curmovie.play();
};
// CSVファイルを読み込む
csv_data.curmovie = this; // 制御するMC
csv_data.load("ファイル名.csv"); // ファイルを読み込む
これを1つのフレームに書いて、読み込んだデータの使用は次のフレームから行ってください。
大きな違いは1行目でMCを一度停止させ、38行目で処理の終了によってMCが再生されるまで待っているところです。
MCは42行目で与えてますが、これは後々クラス化しようと思ってこうしただけで、38行目で直接指定してもこの場合は構いません。
あと、ちょっと変更して35行目あたりで値をグローバル変数data_inに2次元配列で代入してます。別にデータ形式は自由にしていただいてもなんら問題はありません。
これなら安定してCSVファイルも読み込めるかと。ただやっぱり「"」の処理を行ってないので、それだけは何とかしないとなぁと思います。