Flashコンテンツを更新する時に、アプリをわざわざ立ち上げずに外部にXMLファイルやテキストファイルを更新する方法とかが一般的だと思いますが、要素が増えていくと管理自体が大変だったり、データを作るのが大変だったりします。そこで考えたのが、Excleなどで入稿データを管理し、CSVファイルに書き出したものをFlashが読み込むことができないものか。調べてみると方法がありましたのでメモります。ActionScript3.0でCSVファイルを読み込む方法です。

文字コードに気をつけましょう!

ExcelからCSVに書き出したファイルは、おそらくShift-JISに文字コードがなっていると思います。書き出したCSVファイルを、文字コードが変更できるテキストエディタで保存しなおすのは、ちょっとだけナンセンスなんで、下記のサンプルコードには文字コードをUTF-8に変換するJcodeライブラリを使わせていただきます。よっぽどのことがない限りないと思いますが、これでCSVファイルの文字コードがEUCの場合でも変更できます。 もし、余計なライブラリを読み込みたくないー!場合は、 System.useCodePagetrue にしましょう。

Jcode.asはここからダウンロードできます。
http://web2memo.blog120.fc2.com/blog-entry-221.html

ActionScript3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.net.URLStream;
    import flash.utils.ByteArray;
    //Jcodeインポート
    import com.web2memo.text.Jcode;
    public class csvParser extends Sprite {
        public static  const LOAD_COMPLETE:String = "load_complete";
        //CSVパース
        public var csvArr:Array = new Array();
        //コンストラクタ
        public function Main() {
            //CSVファイルのパス
            var csvUrl = new URLRequest("http://localhost/csv/test.csv?p="+new Date().getTime());
            var csvStreamr:URLStream = new URLStream();
            csvStreamr.load(csvUrl);
            //イベント設定
            csvStreamr.addEventListener(Event.COMPLETE, csvLoaderComplete);
        }
        //読み込み完了
        function csvLoaderComplete(event:Event):void {
            var stream:URLStream = URLStream(event.currentTarget);
            var bytes:ByteArray = new ByteArray();
            stream.readBytes(bytes, 0, stream.bytesAvailable);
            //文字コード変更
            var csvData:String = Jcode.getInstance().SJIStoUTF8(bytes);
            csvArr = parseCSV(csvData);
            //出力
            var n:uint = csvArr.length;
            dispatchEvent(new Event(LOAD_COMPLETE));
        }
        //パース&多重配列化
        function parseCSV(str:String):Array {
            //CSVの配列
            var arr:Array = new Array();
            //改行コードをすべて「\n」に
            str = (str.split("\r\n")).join("\n");
            str = (str.split("\r")).join("\n");
            //改行ごとに区切る
            var theFileArray:Array = str.split("\n");
            //最終行が空白の場合は削除
            if (theFileArray[theFileArray.length - 1] == "") {
                theFileArray.pop();
            }//項目名
            var theFieldNames:Array = removeWQuotes(theFileArray[0]).split(",");
            //trace(theFieldNames)
            //項目数
            var numberOfFields:uint = theFieldNames.length;
            //項目処理
            for (var j:uint=0; j< theFileArray.length; j++) {
                var tempArray = removeWQuotes(theFileArray[j]).split(",");
                var tempObj = new Object();
                for (var k:uint = 0; k < numberOfFields; k++) {
                    //各データを項目名に合わせてオブジェクト化
                    tempObj[k] = removeComma(tempArray[k]);
                }
                //1行の情報を追加
                arr.push(tempObj);
            }
            return arr;
        }
        //カンマの整形
        function removeComma(str:String):String {
            str = (str.split(";:;")).join(",");
            if (str.charAt(0) == '"' || str.charAt(0) == "'") {
                return str.substr(1,str.length - 2);
            } else {
                return str.split(";:;").join(",");
            }
        }
        //ダブルクォートの整形
        function removeWQuotes(str:String):String {
            var tempArr:Array = str.split('"');
            if (str.charAt(0) == '"') {
                for (var i:uint = 0; i < tempArr.length; i = i + 2) {
                    tempArr[i] = (tempArr[i].split(",")).join(";:;");
                }
            } else {
                for (var j:uint = 1; j < tempArr.length; j = j + 2) {
                    tempArr[j] = (tempArr[j].split(",")).join(";:;");
                }
            }
            return tempArr.join('"');
        }
    }
}

メインタイムラインの記述

上記のActionScriptをコピペしたら、 csvParser.as というファイル名で保存します。flaファイルと同じディレクトリに置いたら、メインタイムラインに下記のように書きます。

ActionScript3
1
2
3
4
5
6
7
8
9
10
//変数CSV_DATAに格納される
var CSV_DATA:csvParser = new csvParser();
//ロード完了時のリスナー登録
CSV_DATA.addEventListener(csvParser.LOAD_COMPLETE,onLoadConplete);
//csvArrに2次元配列が入っているので、こんな感じにパースできます
for (var i:int = 0; i<CSV_DATA.csvArr.length; i++) {
        trace(CSV_DATA.csvArr[randAry[i]][0]);
        trace(CSV_DATA.csvArr[randAry[i]][1]);
        trace(CSV_DATA.csvArr[randAry[i]][2]);
}