ActionScript3にてCSVファイルを読込む方法


こんばんは!

以前の記事で、AS3でのCSVのパースができました〜みたいな記事(こちら)があったのですが、
実際に利用できるソースが載せてありませんでした。(俺のバカ)

ぼちぼちアクセスもあり、ないと思っていた需要が少しはありそう(?)なので
CSVUtilsを利用したCSVの取込みについてまとめました。

目次

  1. CSVUtilsのライブラリの配置
  2. CsvParserクラスの作成
  3. CsvParserクラスの利用方法

CSVUtilsのプロジェクトの配置

CSVUtilsは、sparkプロジェクトの以下ページよりダウンロードします。

http://www.libspark.org/wiki/kujirahand/CSVUtils

ページ内にも書かれていますが、プロジェクト内のcom/kujirahand に
ダウンロードしたCSVUtils.asを配置することで利用可能になります。

CsvParserクラス

CSVUtilsを利用してCSVファイルを読込むためのクラス(CsvParserクラス)を用意します。

概要

インスタンス化する際に、読み込むファイル名を渡します。

ファイルの取込みは、URLLoaderを利用しています。
URLLoaderは、ファイルの読み込みが非同期になり、読み込み終了時に
flash.events.EventクラスのEvent.COMPLETEイベントが発生します。

CsvParserクラスもこれに合わせたかったので、EventDispatcherクラスを継承し、
正常終了時にCOMPLETEイベント、エラー時にはERRORイベントを送出します。
(ついでに、開始時にSTARTイベントを送出します。)

ファイルの読み込み終了時処理(onCompleteExecute関数)にて、CSVファイルの中身(stream)を
CSVUtilsを利用して配列に変換し、ローカル変数のresultに保持します。
これにより、呼び出し元のコールバック関数にてCSV解析結果(result)を参照できるようにしてます。

CsvParserクラス(プログラムソース)

以下、CsvParserクラスのソースです。

package
{
  import com.kijimura.CSVUtils;

  import flash.events.Event;
  import flash.events.EventDispatcher;
  import flash.events.IOErrorEvent;
  import flash.net.URLLoader;
  import flash.net.URLRequest;

  public class CsvParser extends EventDispatcher
  {
    /* CSVファイルパス */
    protected var _filePath:String;

    /* CSVのパース結果 */
    public var result:Array;

    public static const START:String = "start";
    public static const COMPLETE:String = "complete";
    public static const ERROR:String = "error";

    /**
    * CSVサービスのコンストラクタ
    */
    public function CsvParser(path:String) {
      _filePath = path;
    }

    /**
     * CSVファイルを読み込む
     */
    public function execute():void {
      this.dispatchEvent(new Event(CsvParser.START));
      // ファイルを読み込み
      var loader:URLLoader = new URLLoader();
      var request:URLRequest = new URLRequest(_filePath);
      loader.addEventListener(Event.COMPLETE, onCompleteExecute);
      loader.addEventListener(IOErrorEvent.IO_ERROR, onErrorExecute);
      loader.load(request);
    }

    /**
    * ファイルの読み込みが終了した場合に呼び出されるコールバック関数
    */
    protected function onCompleteExecute(e:Event):void {
      var stream:String = e.target.data;
      result = streamToArray(stream);
      this.dispatchEvent(new Event(CsvParser.COMPLETE));
    }

    /**
     * ファイルの読み込みに失敗した場合に呼び出されるコールバック関数
     */
    protected function onErrorExecute(e:Event):void {
      // エラー処理を記述
      this.dispatchEvent(new Event(CsvParser.ERROR));
    }

    /**
    * 引数のstreamを配列に変換して返す
    */
    protected function streamToArray(stream:String):Array {
      return CSVUtils.CsvToArray(stream);
    }

  }
}

CsvParserクラスの利用方法

作成したCsvParserクラスは、下記のように利用します。

概要

CsvParserクラスをインスタンス化する際に、読込むCSVファイルを引数に指定します。
続けて、CSVファイルのパースが終了した際に発生するCOMPLETEイベントのコールバック関数を
指定します。(エラー処理は省略)
execute()にて、CSVファイルの読み込みを開始します。

コールバック関数の引数のEventのtargetプロパティはCsvParserクラスを指しています。
読み込んだ結果を参照する際には、CsvParserクラスで結果を保持したresultプロパティを
参照すればOKです。
ここでは、Array -> ArrayCollectionに変換したものをresultCollectionに入れています。

使用例

以下、使用例となります。

  /*
  * CSVファイルの読込みを開始する
  */
  private function startLoadingCsv():void {
    // CSV読込み
    var parser:CsvParser = new CsvParser("test.csv");
    parser.addEventListener(CsvParser.COMPLETE, onComplete);
    parser.execute();
  }

  /*
  * CSV読込み完了時にのコールバック関数
  */
  private function onComplete(e:Event):void {
    var resultCollection:ArrayCollection = new ArrayCollection(e.target.result);
    // 読み込み後処理
  }

まとめ

一応、こちらにて正常系の処理の動作確認は出来ました。
エラー処理が十分に甘いので、こちらのソースを利用する際は、この辺りを加味して
利用して下さい。
何かのお役に立てれば幸いです。

それでは!