TEXT読込み(コード)
[ TEXT読込み ]dated 2012-10-3 Mori Design Office
テキストファイルやcsvファイルを読込みます。 実行はここをクリック
対応ブラウザ: IE, Firefox. Google chrome, Opera。 文字コード切替え: shift-jis, utf-8
ここで、呼込み方法は下記の3通り。
  @ FileAPI を用いる方法:
    ・対応ブラウザ:IE以外の殆ど総て。(IEはvar10で対応とのこと)
    ・ファイル指定方法:input type=file の操作、Firefox,Google ではドラッグ&ドロップも可能。
    XMLHttpRequestと異なり、呼込み先ディレクトリの制約がない。サーバーアドレス有無に無関係。
    ・対応エンコード:2種類切替え可能(shift-jis、utf-8)。
    ・呼込み先が決まっている場合の自動読込みは、FileAPIでは不可能、従来方法(下記AB)がある。
  A XMLHttpRequest を用いる方法:総てのブラウザに対応
    ・ファイル指定方法:相対パスで指定、またはカレントディレクトリにある場合の ファイル名で指定。
    input type=file の操作(ie以外はカレントディレクトリ内のみ可能)。区切り\を/に変換要。
    IEで通常のアドレス(C:\・・ など)で、絶対パスのファイル名も可能
    IEでサーバアドレス http://localhost/・・では、相対パス指定のみ可能。但しinput type=file
    の操作で取得できるのは fakepath/ファイル名 となり、事実上のカレントディレクトリ外では不可。
    ・対応エンコード:utf-8のみ。Excelによるcsvファイルはshift-jisなので、日本語はボケる
  B fso を用いる方法:
    ・IEのみ対応、スクリップトは簡単。特にサーバーを必要としない。
    ・ファイル指定方法:input type=file の操作、または 絶対パスのファイル名、区切り\を/に変換要。
    サーバーApacheのアドレス http://localhost/・・でなく、C:/・・の絶対パスであることが必要。
    ・対応エンコード:shift-jisのみ。
  ☆ なお、Windows 8 API はここでは除外してますので、公式サイト参照。 →Microsoft: WL.download function

下記はそのソース、JavaScriptコード です。

<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html,JavaScript,HTML5; charset=shift_jis">
<title>TEXT読込み</title>
<script language="JavaScript">
<!--

// TEXTやcsv ファイルを読込む、3通りの方法から自動選択、 File API及びFSOを優先し、不適でXMLHttp とする。
// 文字エンコードの切替え( shift-jis、utf-8):File APIは可能、IEではFSOとXMLHttpの切替えによる。

var File;
var $id = function(id) { return document.getElementById(id); }
var Encode = "shift-jis";
var WindowFile = 0;

window.onload = function(){    //イベント登録
  var winF;
  doc = "";
  if(window.File){
       winF = 1;doc = "[ File API ]";//operaは参照クリックのみ可能
       if(navigator.userAgent.toLowerCase().indexOf("opera")<0){ onload_FileAPI(); doc += " ドラッグ&ドロップ";}
  }
  if(document.all==null&&window.File==null){winF = 2;doc = "[ XMLHttp ] カレントディレクトリ内";} 
  if(document.all){
        winF = 3;doc = "[ FSO ]";
        if(location.href.substr(0,5)=="http:"){winF = 4;doc = "[ XMLHttp ] カレントディレクトリ内";}
  }
  if(winF==2||winF==4){$id("en1").style.color = "gray"; encodeTy(2);}
  WindowFile = winF;  
  $id("results").innerHTML = doc;
};


// @ File API ------------------------------------------------------------------

function onload_FileAPI(){
                  $id("ta").addEventListener("dragover", onCancel, false);
                  $id("ta").addEventListener("dragenter", onCancel, false);
                  $id("ta").addEventListener("drop", onDropFile, false);             //ドラッグアンドドロップ
}

var onCancel = function(e)
{
    if(e.preventDefault) { e.preventDefault(); }
    return false;
};

var onDropFile = function(e)  { e.preventDefault();  File = e.dataTransfer.files[0]; readFile(File); $id("Ref").reset(); };

            
var readFile = function(file)                                    
{
   $id("f_name").innerHTML = file.name;                     // ファイル名を表示
   var reader = new FileReader();                           // Mozilla 規格のオブジェクト
   reader.onload = function(e) {  main(e.target.result); }; // 読み出し
   reader["readAsText"](file, Encode);
                 //なお、readAsText の他の方法 readAsArrayBuffer,readAsBinaryString,readAsDataURL
};

function onChangeFile(){
   if(WindowFile==1){file = $id("buttonRef").files[0];  readFile(file);}//File = e.target.files[0];
   if(WindowFile==2){file = $id("buttonRef").files[0].name;XMLHttp(file );}
   if(WindowFile==3){//ie
       file = en($id("buttonRef").value); 
       if(Encode=="shift-jis"){$id("results").innerHTML = "[ FSO ]"; FSO(file );}
       if(Encode=="utf-8"){$id("results").innerHTML = "[ XMLHttp ]"; XMLHttp(file );}
   }
   if(WindowFile==4){//ieアドレスhttp://localhost/・・
       var sp = (en($id("buttonRef").value)).split( "/" );
       file = sp[sp.length-2]; // データアドレスc:\fakepathなので相対パス不明
       XMLHttp(file );      // 従ってデータファイルはカレントディレクトリにあるとする
   }
   if(WindowFile!=1){$id("f_name").innerHTML = file;}      // 選択したファイル名を表示
   File = file;              //文字エンコード切替え用に 広域変数に代入
}



// A XMLHttp   ----------------------------------------------------------------- 

function XMLHttp(fileName ){ //ファイルにアクセスし受信内容を確認します
    var httpoj = createXMLHttpRequest();
    httpoj.open( 'GET' , fileName , true ); 
    httpoj.onreadystatechange = function() {  httpSate(httpoj); }
    httpoj.send( null ); 
  }

  function createXMLHttpRequest(){//XMLHttpRequestオブジェクト生成
    if(window.ActiveXObject){
        try {return new ActiveXObject("Msxml2.XMLHTTP"); } //(MSXML2以)
        catch (e) {
            try {return new ActiveXObject("Microsoft.XMLHTTP") }//Win ie用(旧MSXML)
            catch (e2) {return null}
        }
    }
    else if(window.XMLHttpRequest){return new XMLHttpRequest()} //Win ie以外
    else {return null}
  }


function httpSate(httpoj){//通信状態確後、結果出力
  var disp = "";
  var data,i,j,da,line;
  if ((httpoj.readyState == 4)){
    data = httpoj.responseText; //[6] 通信テキスト文の取得
    //cr = csvファイルのデータ区切り(改行コード)、da[i] = 取得データ
    var cr = String.fromCharCode(13); //又は cr = new RegExp("\r\n|\r|\n", "g","n");
    line = data.split(cr);
    for (j=0; j<line.length; j++){
       da = line[j].split(",");
       i = 0; disp += da[i];
       for (i=1; i<da.length; i++){  disp += ","+da[i] ;}
       disp += cr;
    }
  }
  else{ disp = "<b>Loading...</b>";}
  main(disp);
}


// B FSO ------------------------------------------------------------------------

function FSO(fullFileName){
  //ie 絶対パスのフルファイル名指定ではFSOを用いる、
  var fso = new ActiveXObject("Scripting.FileSystemObject");//ASCIIフォーマットで読み込む
  var data = fso.OpenTextFile( fullFileName ,1,true); //読込み(http相対でエラー)
  var disp = "";
  var i,j,da,line;
  while  (!data.AtEndOfLine){
       line = data.ReadLine();
       da = line.split(",");
       i = 0; disp += da[i];
       for (i=1; i<da.length; i++){  disp += ","+ da[i] ;}
       disp += "\n";
  }
  data.Close();
  main(disp);
}


// 共通------------------------------------------------------------------------
function en(o){    //円記号\をスラッシュに置換
    var oo = o;
    var da,dt;
    
    var cr = String.fromCharCode(92); //円記号
    da = oo.split(cr);
    dt = da.length-1;
    if(dt>0 ){
          oo = da[0];
          for (j=1; j<da.length; j++){oo += "/"+da[j];}
    }
    return oo;   
}

function encodeTy(n){  //文字エンコード切替え表示、再作動
   var c1,c2,c3,c4,cc;
   var nn = n;
   var winF = WindowFile;
   if(winF==2||winF==4){nn = 2;} 
   if(nn==1){Encode = "shift-jis"; c1 = "yellow"; c2 = ""; c3 = "underline"; c4 ="none";}
   if(nn==2){Encode = "utf-8";     c2 = "yellow"; c1 = ""; c4 = "underline"; c3 ="none";}
   $id("en1").style.background = c1;
   $id("en2").style.background = c2;
   $id("en1").style.textDecoration = c3;
   $id("en2").style.textDecoration = c4;
   if(winF==3){
       if(n==1){$id("results").innerHTML = "[ FSO ]";}
       if(n==2){$id("results").innerHTML = "[ XMLHttp ]";}
   }
   if(winF==1){if(File.name){readFile(File);}}
   if(File){
      if(winF==2){XMLHttp(File);}
      if(winF==3){
         if(n==1){FSO(File);}
         if(n==2){XMLHttp(File);}
      }
      if(winF==4){XMLHttp(File);}
   }
}  
 
function main(data){ $id("ta").value = data;}  //データ処理のメイン


//-->
</script><body style="margin-left:30px;line-height:25px">
<span id="results" style="color:green"></span><br>
       文字エンコード:
       <a id="en1" href="JavaScript:onclick=encodeTy(1)" style="background:yellow;text-decoration:underline">shift-jis</a>
       <a id="en2" href="JavaScript:onclick=encodeTy(2)" style="text-decoration:none">utf-8</a><br>
  
       読込みファイル名 : <span id="f_name">XXXXXX</span>

       <form id="Ref"><input id="buttonRef" onchange="onChangeFile()" type="file" size="100" style="width:574px"></form>
       <textarea id="ta" cols=70 rows=15 wrap="off" style="width:570px;height:300px"></textarea><br> <br>

</body>