スタートページ> 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 で記述されているものとします。
子ファイル(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>
▼▼▼▼▼ ここから ▼▼▼▼▼
▲▲▲▲▲ ここまで ▲▲▲▲▲
子ファイル(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>
▼▼▼▼▼ ここから ▼▼▼▼▼
▲▲▲▲▲ ここまで ▲▲▲▲▲
見掛行 有効行 0 0 123456,鈴木太郎,工学部 1 1 987654,_□佐藤花子□,__文学部□□ 2 □_ (空白行) 3 2 111111,佐藤二郎 4 (空白行)
Excelなど表計算ソフトのデータをプレーンテキストで記録する形式に、CSVがあります。図のExcelデータを、「CSV(カンマ区切り)」で保存すると、CSVファイルの内容(called/plain3.csv)は次のようになります。
番号,氏名,学部 123456,鈴木太郎,工学部 987654,佐藤花子,文学部 111111,佐藤二郎, (空白セルがあるとき「,」が付く) (最後に空白行がある) | 文学部