• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:FLASHでCSVを配列で読込後、読み込んだ配列を関数の外で使いたい。)

FLASHでCSVを配列で読込後、読み込んだ配列を関数の外で使いたい。

このQ&Aのポイント
  • FLASHでCSVを配列で読み込み、関数の外で使用する方法を教えてください。
  • FLASHでCSVファイルを読み込み、読み込んだデータを配列として取得する方法を教えてください。
  • FLASHでCSVファイルを配列に変換し、他の関数で使用する方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.5

配列変数 csvRows は最初は空っぽで、値は onData = function で定義された関数が実行された後、つまり、CSV の読み込みが完了した後で入ります。 csvRows の値を他の場所で使う場合は、中身が入るまで待つ必要があります。 いろいろな方法がありますが、一旦タイムラインを止めて読み込みの完了を待ち、配列変数に値が格納されてから先に進むようなフレーム構成にしてはいかがでしょう。 構成の一例です。 まず、ご提示のスクリプトの最後に stop(); を入れてタイムラインを停止させ、読み込みが終わるまでこのフレームで待ちます。 次に、onData = function の最後に play(); を入れ、配列変数に値を入れてからタイムラインを再度動かします。 csvRows の値を使うスクリプトやテキストフィールドなどは、このスクリプトを書いたフレームよりも後ろのフレームに記述・配置するようにします。 csvRows は関数の外で定義されていますから、このスクリプトが記述されているタイムラインのものになります。 例えばメインのタイムラインに書かれている場合は、一般的には _root という名前のムービークリップのものになっています。 他のムービークリップから参照する場合はターゲットパスの誤りにご注意ください。 ----- ActionScript は、何かの出来事(イベント)が発生した時に行う処理を先に約束しておき、実際にそのイベントが発生した時には約束してあった処理が自動的に行われる仕組みを採用しています。 今回の件ですと、データが読み込まれた時にイベントが発生し、onData に登録された関数が自動的に実行されます。 onData = function は「イベントが発生した時に、この関数を呼び出す」と約束するだけで、関数は実行されません。 この時、スクリプトは停止せず、「 onData に、イベント発生時に実行する関数を登録する」という処理を終えたら、続けて次のスクリプトが実行されます。 読み込みが完了するまで onData = function の部分でスクリプトが止まっているのではありませんので、onData に登録した関数が呼び出される前に先に進むと、csvRows が空っぽのまま次のスクリプトが実行されてしまいます。

aimtaku
質問者

お礼

できましたぁぁぁぁ!!!!! 長文ありがとうございますっ(;_;)

その他の回答 (4)

  • Hardking
  • ベストアンサー率45% (73/160)
回答No.4

そうですか。 >var tempArray = theFileArray[i].split(","); >csvRows.push(tempArray); tempArrayが関数内のローカル変数で、そのインスタンスを pushしているのが原因ぽいですね。 for(var i=0; i<theFileArray.length; i++){ csvRows[i] = new Array(); var tempArray = theFileArray[i].split(","); for (var j=0; j < tempArray.length; j++) { csvRows[i][j]= tempArray[j]; } } でどうでしょうか?

aimtaku
質問者

お礼

どうやら、処理が全て終わる前に、次のフレームに行ってしまっていたのが原因だったようです。。。 解決しました。ありがとうございました。

  • Hardking
  • ベストアンサー率45% (73/160)
回答No.3

今度は.CSVRowsを_globalで修飾したらどうでしょうか? 定義/生成 _global.csvRows = new Array(); var csvLoader = new LoadVars(); var theFileObj = new LoadVars(); 参照 _global.csvRows[1][1]

aimtaku
質問者

補足

関数のを抜け出したら、配列がリセットされてしまっているようです。 _global.csvRows[1][1]にしても、同様でした・・・。

  • Hardking
  • ベストアンサー率45% (73/160)
回答No.2

スコープ範囲の問題です。 csvRowsの定義/生成する箇所を変更し、再試行したらどうでしょうか? var csvRows = new Array(); var csvLoader = new LoadVars(); var theFileObj = new LoadVars(); var theFile = csvLoader.sendAndLoad("test.csv",theFileObj,GET ); (省略)

aimtaku
質問者

補足

回答ありがとうございました。 ダメでした・・・。 戻り値を設定したりすればいいんですかね・・・?

  • Hardking
  • ベストアンサー率45% (73/160)
回答No.1

csvRowsはCSVファイルの全データが二次元配列で格納されたので 添え字を行と列の2つ分必要です。 参照方(二次元配列の1要素毎) for(var i=0; i<theFileArray.length; i++){ for(var j=0; j<csvRows[i].length; j++){ trace(csvRows[i][j]); } }

aimtaku
質問者

補足

theFileObj.onData = function(src)内での、trace(csvRows[1][1])等の表示は現在出来ているのですが、そこから出て処理を処理したい場合に困っています。。。

関連するQ&A

専門家に質問してみよう