2009-11-20

Flash AS3 Study : read external file

Flashの学習(14) AS3で外部ファイル読み込み 2009-11-20

[話者] ActionScript3.0(AS3)でファイルの読み込みだ。

// main tileline(root)の第1フレームに書く
var ld:URLLoader = new URLLoader();
var req:URLRequest = new URLRequest("TEL-TOKYO-UTF8.CSV");

//ファイル読み込みが完了したら do_file()を実行する
ld.addEventListener(Event.COMPLETE, do_file);
ld.load(req);


function do_file(ev:Event):void {
    var file:String = ld.data;
    var ptn:RegExp = /\n|\r\n?/; //改行コード LF/CRLF/CRに対応
    var content:Array;

    //ファイルを1行ごとに処理する
    var lines:Array = file.split(ptn);
    for (var i:String in lines){
        //カンマで分解
        var elem:Array = lines[i].split(',');
        //文字列前後のダブルクォーテーションがあれば削除
        for(var j:Number=0; j<elem.length; j++){
            elem[j] = elem[j].replace(/^\"/,'').replace(/\"$/,'');
        }
        //undefined は表示しない
        if(elem.length > 0){
            trace('郵便番号:',elem[2],' 住所:',elem[6],elem[7],elem[8]);
        }
    }
}

ここでは TEL-TOKYO-UTF8.CSV というファイルを読み込んでいるけど、これは 郵便局の「住所の郵便番号(CSV形式)」 http://www.post.japanpost.jp/zipcode/download.html で取得した東京都のデータを、テキストエディタで開いてUTF-8(BOMつき、改行コードCRLF)で保存したものだ。 元はShift_JISのファイル(13TOKYO.CSV, 416KB)なんだけど、UTF-8に変換したら662KBになってしまった。

このCSVファイルを置くのは、swfファイルの場所じゃなくて、swfファイルを読み込むhtmlファイルの場所が基準になるんだ。 今回はFlashCS3で「ムービーのプレビュー」してるから、swfと同じ場所に置いてるけど。

[合いの手] CSVファイルというのはExcelでも扱えるファイル形式だね。カンマ「,」でデータが分けられているという。

[話者] 元はこんなデータだよ。

|| 13101,"100 ","1000000","トウキョウト","チヨダク","イカニケイサイガナイバアイ","東京都","千代田区","以下に掲載がない場合",0,0,0,0,0,0 13101,"102 ","1020072","トウキョウト","チヨダク","イイダバシ","東京都","千代田区","飯田橋",0,0,1,0,0,0 13101,"102 ","1020082","トウキョウト","チヨダク","イチバンチョウ","東京都","千代田区","一番町",0,0,0,0,0,0 13101,"101 ","1010032","トウキョウト","チヨダク","イワモトチョウ","東京都","千代田区","岩本町",0,0,1,0,0,0 13101,"101 ","1010047","トウキョウト","チヨダク","ウチカンダ","東京都","千代田区","内神田",0,0,1,0,0,0 13101,"100 ","1000011","トウキョウト","チヨダク","ウチサイワイチョウ","東京都","千代田区","内幸町",0,0,1,0,0,0 13101,"100 ","1000004","トウキョウト","チヨダク","オオテマチ(ツギノビルヲノゾク)","東京都","千代田区","大手町(次のビルを除く)",0,0,1,0,0,0 ... ```

このデータを整形して、とりあえずtrace()したらこうなった。

[合いの手] なんだこれ?

[話者] テキストファイルで662KBのデータは重かったらしい。処理の途中でエラーになってしまった。 スタートしてから15秒ほど「出力」ウィンドウに何も表示されなくて、15秒経ったらこの画面になったんだ。

もしかして「出力」ウィンドウへの出力か時間かかるのかと思って、trace()をコメントにしたけど同じだ。 ローカルファイルを読み込んでいるので、ネットワークが重い とかではない。

たった0.6MBでこれだからな。AS3はテキストの扱いは苦手なのかもしれないな。

Rubyで同じ動作のプログラム走らせると、4秒以下で終了するからな。

# -*- coding: utf-8 -*-
file = File.open("TEL-TOKYO-UTF8.CSV").read;

file.split(/\n|\r\n?/).each do |line|
  elem = line.split(',')
  elem.length.times do |i|
    elem[i] = elem[i].gsub(/^\"/,'').gsub(/\"$/,'')
  end
  if elem.length > 0
    print '郵便番号:',elem[2],' 住所:',elem[6],elem[7],elem[8],"\n"
  end
end
remote@SSSX ~$ time /c/Program\ Files/ruby-1.8/bin/ruby.exe csv.rb 
...

real    0m3.375s
user    0m0.015s
sys     0m0.015s

** 変数のスコープ

ブロック内ローカルって考え方はないみたい。

for (var i:int=0; i<6; i++){
    trace('i=',i);
    var c = i;
}
trace('out i=',i);
trace('out c=',c);
i= 0
i= 1
i= 2
i= 3
i= 4
i= 5
out i= 6
out c= 5

0 件のコメント:

コメントを投稿

人気記事