トップページ > JavaScript > クラスライブラリ集 > CSVリーダー
 
CSVリーダー
ver.1.2
<機能と特徴>
外部CSVファイルからデータを取り込むクラス。

Excelなどの表計算ソフトなどで出力したデータを取り込めます。
   
インフォメーション


公開日 2005.1.18
最終更新日 2005.7.10
バージョン ver 1.2
動作確認
IE5.0 IE6.0 NN4.7 NN6.2 NN7.0
Opera7.5 FireFox1.0
取扱難易度 ★★★★☆難易度4
cookie 不使用
CSS 使用(無効でも動作は可能)
更新履歴
2005.3.16 ver.1.1 読み込み完了後に実行する関数が正常に動作しないことがある不具合を修正
2005.7.10 ver.1.2 データバインドからCSVリーダーに改名
CSVの読み込みに特化した仕様に変更
 
リファレンス

 
ソース

<script language="JavaScript" type="text/javascript">
<!--
//copyright(C) 2005 あう http://www5c.biglobe.ne.jp/~horoau/
//ver1.2

//CSVリーダークラス
function csv_reader()
{
 //設定
 this.delim    = ","; //区切り記号
 this.qout     = '"'; //テキストの区切り記号
 //ここまで

 this.readyState = "ready";

 //csv読み込み準備
 this.setup = function (url,script)
 {this.func       = script;
  this.readyState = "loading";
  with(document)
  {if(url && document.getElementById)
   {if(!getElementsByTagName("body")[0])
    {setTimeout("obj_bank.withdraw("+obj_bank.deposit(this)+").setup('"+url+"','"+script+"');",300);
     return;}
    else if((document.all && navigator.userAgent.indexOf("Opera") == -1) &&
            (document.readyState != "interactive" && document.readyState != "complete"))
    {setTimeout("obj_bank.withdraw("+obj_bank.deposit(this)+").setup('"+url+"','"+script+"');",300);
     return;}
    this.data_frame = createElement("iframe");
    var i = 0;
    while(getElementById("frame_id"+i))
    {i++;}
    with(this.data_frame)
    {setAttribute("id","frame_id"+i);
     setAttribute("name","frame_id"+i);
     setAttribute("src",url);
     setAttribute("width","1");
     setAttribute("height","1");
     style.position   = "absolute";
     style.visibility = "hidden";}
    document.getElementsByTagName("body")[0].appendChild(this.data_frame);
    this.iframe = eval("window.frame_id"+i);
    if(!document.all)
    {this.iframe.document.getElementsByTagName("html")[0].innerHTML = '<body>';}
    this.iframe.check_loading = 1;
    this.check();}
   else
   {this.readyState = "error";
    return;}}}

 //読み込み状態チェック
 this.check = function ()
 {if(this.iframe)
  {if(!this.iframe.check_loading && (document.all && navigator.userAgent.indexOf("Opera") == -1))
   {this.readyState = "error";
    return;}
   if(this.iframe.document)
   {if(this.iframe.document.readyState == "complete")
    {this.reading();
     return;}
    else if(this.iframe.document.getElementsByTagName("html")[0])
    {if(this.iframe.document.getElementsByTagName("html")[0].innerHTML.match(/<\/body>$/))
     {this.reading();
      return;}}}}
  this.id = setTimeout("obj_bank.withdraw("+obj_bank.deposit(this)+").check();",10);}

 //データ取り込み
 this.reading = function ()
 {clearTimeout(this.id);
  if(!this.iframe.document.body.getElementsByTagName("pre")[0])
  {this.readyState = "error";
   return;}

  this.data_line = this.iframe.document.body.innerHTML.replace(/^<pre>/i,"").replace(/<\/pre>$/i,"").replace(/\r\n?/g,"\n").split(/\n/);

  for(var i=0;i<this.data_line.length;i++)
  {var re = new RegExp('\x20*'+this.qout+'[^'+this.delim+']*'+this.qout+'\x20*'+this.delim+'?'+'|\x20*'+'[^'+this.delim+this.qout+']*'+this.delim+'?','g');
   this.data_line[i] = this.data_line[i].match(re);
   this.data_line[i].length -= 1;}

  for(var i=0;i<this.data_line.length;i++)
  {for(var ii=0;ii<this.data_line[i].length;ii++)
   {if(this.data_line[i][ii] == undefined)
    {this.data_line[i][ii] = "";}
    else
    {re = new RegExp('^\x20*'+this.qout+'?','g');
     this.data_line[i][ii] = this.data_line[i][ii].replace(re,"")
     re = new RegExp(this.qout+'?\x20*'+this.delim+'?$','g');
     this.data_line[i][ii] = this.data_line[i][ii].replace(re,"");}}}

  document.getElementsByTagName("body")[0].removeChild(this.data_frame);
  this.readyState = "complete";
  eval(this.func);}}

//オブジェクト預りクラス
function obj_bank()
{var bank = new Array();
 this.deposit = function (obj)
 {for(var i=0;bank[i];i++)
  {;}
  bank[i] = obj;
  return i;}

 this.withdraw = function (no)
 {var payment  = bank[no];
  bank[no] = "";
  return payment;}}

//インスタンス生成
obj_bank = new obj_bank();

// -->
</script>

 
開発日誌

[ 2005.7.10 ] ver.1.2

クラスライブラリのリニュついでにデータバインドからCSVリーダーに改名してみた。 必要最小限の機能にした方が何かと使いやすい場合もあるからね。 クラスライブラリの場合、ある意味部品なわけだしなおさらね。 それにデータバインドと呼んでしまうと IEのデータバインドが多機能だからそのイメージになりそうだからね。
[ 2005.3.16 ] ver.1.1

自分でこのクラス使ってみようとして始めて不具合に気付いたわ。 動作確認はちゃんとしてるんだけど やっぱり実際に使う場合とは違う点多いからね。 実際このクラス自体かなり無理な部分もあったりするから ある程度は仕方ないんだけど 直せる点は直していかないとね。
[ 2005.1.18 ] ver.1.0

何とか初版公開。 データバインド機能って便利そうではあるんだけど 何せIEのみの対応だから気が引けてしまって。 だったらってことでデータバインドクラス作ってみました。 表計算ソフトからの出力だとか使い道は結構あるかと。

スクリプト全体は案外簡単に組みあがったものの ブラウザ毎の差異が大きくてその調整に難航。 一時は開発断念かとも思われたが何とか完成。 作る前からこのクラスで取り込んだデータを処理する 拡張クラスの構想いくつも練ってたし クラスライブラリ集を公開開始するに当たって 当面の目玉として考えてたからね。 無事に出来上がってよかった。

1つ気にかかるのがExcelで出力したCSVの対応。 聞くところによると一癖あるらしいし とりあえず調べた限りは対応出来るようにはしておいたつもりだけど。 ちなみに筆者はExcelは使ってないんで 何か問題点があったら報告してもらえると嬉しいです。



ウェブ木箱
copyright(C) 2005 あう