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 件のコメント:
コメントを投稿