スタートページJavascript外部ファイルの読込Ajaxによる非同期読込

配列データの読込(プレーンテキスト)

2次元配列のデータをもつtxtファイルやCSVファイル(子ファイル)を読み込み、行列[i][2] の形式にします。
ここでは、文字列の加工が重要なので、「正規表現」を参照してください。


(前提)このページのhead部に次のスクリプトが記述されています。

<script>
    function ファイル読込(ファイル名, 読込後処理名) {
        var XMLHR = new XMLHttpRequest();
        XMLHR.onreadystatechange = function() {
            if (XMLHR.readyState == 4 && XMLHR.status==200) {
                var 読込文 = XMLHR.responseText;
                var 読込後処理
                      =  new Function("引数", "return " + 読込後処理名 + "(引数)");    
                読込後処理(読込文);
            }
        }
        XMLHR.open("GET", ファイル名, true);
        XMLHR.send(null);
    }
</script>

<input type="button" value="読込" onClick="ファイル読込('aaa.html', '表示処理')"></input>
とすると、aaa.html の全文が文字列変数「読込文」を引数として関数「表示処理(読込文) { …… } 」が起動されます。
なお、読み込まれるファイル(aaa.html)を子ファイル、読み込むファイル(このページ)を親ファイルといいます。どちらも文字コード UTF-8 で記述されているものとします。


例1:素直なデータ

子ファイル(called/plain1.txt)の内容を示します。

123456,鈴木太郎,工学部
987654,佐藤花子,文学部
111111,佐藤二郎      (学部が欠けています)

子ファイルを読み込んで、
  行列[0][1] = "鈴木太郎", 行列[1][0] = 987654
となるような2次元配列「行列」を作成して表示します。

<script type="text/javascript">
    function 例1(読込文) {
        var 行列 = new Array();

        if (読込文.match(/\r/)) var 行 = 読込文.split("\r\n");  // A
        else                        行 = 読込文.split("\n");

        var 行数 = 行.length;
        for (var i = 0; i < 行数; i++) {
            行列[i] = new Array();                              // B
        }

        var 最大列数 = 0;
        for (i = 0; i < 行数; i++) {
            var 列 = 行[i].split(",");                          // C
            var 列数 = 列.length;
            for (var j = 0; j < 列数; j++) {
                行列[i][j] = 列[j];                             // D
            }
            if (列数 > 最大列数) 最大列数 = 列数;               // E
        }

        var 表示内容 = "";
        for (i = 0; i < 行数; i++) {
            for (j = 0; j < 列数; j++) {
                表示内容 +=  "行列[" + i + "][" + j + "]=" + 行列[i][j] + ", ";
            }
            表示内容 +=  "<br>";
        }
        document.getElementById("例1表示場所").innerHTML = 表示内容;
    }
</script>

<p><input type="button" value="例1表示"
    onClick="ファイル読込('called/plain1.txt', '例1')"></input></p>
<div id="例1表示場所"></div>

▼▼▼▼▼ ここから ▼▼▼▼▼

▲▲▲▲▲ ここまで ▲▲▲▲▲

例2:空白行や行内空白があるとき

子ファイル(called/plain2.txt)の内容
(_ は半角の空白、□は全角の空白です)

123456,鈴木太郎,工学部
987654,_□佐藤花子□,__文学部□□
□_  (空白行)
111111,佐藤二郎
     (空白行)

プレーンテキストでは、かなり雑な記述になりがちです。ここでは、次の規則にしました。

<script type="text/javascript">
    function 例2(読込文) {
        var 行列 = new Array();

        if (読込文.match(/\r/)) var 見掛行 = 読込文.split("\r\n");  // F
        else                        見掛行 = 読込文.split("\n");

        var 見掛行数 = 見掛行.length;
        for (var i = 0; i < 見掛行数; i++) {
            行列[i] = new Array();
        }

        var 有効行数 = 0;
        var 最大列数 = 0;
        for (i = 0; i < 見掛行数; i++) {
            見掛行[i] = 見掛行[i].replace(/\s/g, "");    // G
            見掛行[i] = 見掛行[i].replace(/ /g, "");
            if (見掛行[i] != "") {                          // H
                var 列 = 見掛行[i].split(","); 
                var 列数 = 列.length;
                for (var j = 0; j < 列数; j++) {
                    行列[有効行数][j] = 列[j];
                }
                if (列数 > 最大列数) 最大列数 = 列数;
                有効行数 = 有効行数 + 1;                    // I
            }
        }

        var 表示内容 = "";
        for (i = 0; i < 有効行数; i++) {
            for (j = 0; j < 最大列数; j++) {
                表示内容 +=  "行列[" + i + "][" + j + "]=" + 行列[i][j] + " ";
            }
            表示内容 +=  "<br>";
        }
        document.getElementById("例2表示場所").innerHTML = 表示内容;
    }
</script>

<p><input type="button" value="例2表示"
    onClick="ファイル読込('called/plain2.txt', '例2')"></input></p>
<div id="例2表示場所"></div>

▼▼▼▼▼ ここから ▼▼▼▼▼

▲▲▲▲▲ ここまで ▲▲▲▲▲

例3:タイトル行があるとき(CSVファイル)

Excelなど表計算ソフトのデータをプレーンテキストで記録する形式に、CSVがあります。図のExcelデータを、「CSV(カンマ区切り)」で保存すると、CSVファイルの内容(called/plain3.csv)は次のようになります。

文学部
番号,氏名,学部
123456,鈴木太郎,工学部
987654,佐藤花子,文学部
111111,佐藤二郎,  (空白セルがあるとき「,」が付く)
          (最後に空白行がある)

例1とほぼ同じですが、先頭行をタイトル行として、次のようにしたいのです。
  行列["番号"][0] = 123456 行列["氏名"][0] = "鈴木太郎" 行列["学部"][0] = "工学部"
  行列["番号"][1] = 987654 行列["氏名"][1] = "佐藤花子" 行列["学部"][1] = "文学部"
  行列["番号"][2] = 111111 行列["氏名"][2] = "佐藤二郎"
(このように、添字が自然数ではなく文字列である配列を連想配列といいます。)

<script type="text/javascript">
    function 例3(読込文) {
        var 行列 = new Array();

        if (読込文.match(/\r/)) var 行 = 読込文.split("\r\n");
        else                        行 = 読込文.split("\n");

        var 行数 = 行.length;

        var タイトル名 = 行[0].split(",");         // J
        var 列数 = タイトル名.length;
        for (var j = 0; j < 列数; j++) {
            行列[タイトル名[j]] = new Array();     // K
        }

        for (i = 1; i < 行数-1; i++) {            // L
            列 = 行[i].split(",");
            for (j = 0; j < 列数; j++) {
                行列[タイトル名[j]][i-1] = 列[j];  // M
            }
        }
        行数 = 行数 - 2;                           // N


        var 表示内容 = "例示<br>"
                     + " 行列['番号'][0]=" + 行列['番号'][0] + "<br>"
                     + " 行列['氏名'][1]=" + 行列['氏名'][1] + "<br>";
        表示内容 +="一覧表<br>";
        for (i = 0; i < 行数; i++) {
            for (j = 0; j < 列数; j++) {
                表示内容 +=  "行列['"+ タイトル名[j] + "'][" + i + "]="
                            + 行列[タイトル名[j]][i] + " ";
            }
            表示内容 +=  "<br>";
        }
        document.getElementById("例3表示場所").innerHTML = 表示内容;
    }
</script>

<p><input type="button" value="例3表示"
    onClick="ファイル読込('called/plain3.csv', '例3')"></input></p>
<div id="例3表示場所"></div>

▼▼▼▼▼ ここから ▼▼▼▼▼

▲▲▲▲▲ ここまで ▲▲▲▲▲

結果の「例示」でみるように、2次元の連想配列の形式で読み込まれました。
欠陥値(行列['学部'][2])はundefinedではなくnullになります。それは「佐藤二郎,」の「,」があるからです。