スタートページ> 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,佐藤二郎, (空白セルがあるとき「,」が付く) (最後に空白行がある) | 文学部