
JavaScriptでCSV読み込み
JavaScriptでCSVファイルを読み込んだものをWebサイト内に表示したいことがある。
例えば下記のようなCSVファイルを読み込もうとする場合…
りんご, 100 バナナ, 200 みかん, 300
JavaScriptはこのようになる。
// 間違ったコード // <div id="r"></div> function getCSV() { var req = new XMLHttpRequest(); req.open('get', 'sample.csv', true); req.send(null); req.onload = function() { setCSV(req.responseText); }; } function setCSV(str) { var data = []; var dataArr; var r = document.getElementById('r'); var tmp = str.split('\n'); tmp.forEach(x => { dataArr = x.split(','); data.push(dataArr); }); var t = '<dl>'; data.forEach(x => { t += `<dt>${x[0]}</dt><dd>価格は${x[1]}円</dd>`; }); t += '</dl>'; r.innerHTML = t; } getCSV();
一見すると問題ないように見えるが、実際にこのコードでページ内に表示させると、こちらのリンク先のように表示されてしまう。
CSVの最終行と値の空白を除外する
上記のコードだと空行も配列として追加してしまうためif (dataArr[0])で値が存在する場合だけ配列に追加するよう条件分岐が必要だ。
あとサンプルのCSVではカンマのあとに半角スペースが入っているが、split(',')を使用しているため半角スペースも値に残ってしまい、表示に影響が出てしまう。
これを防ぐにはtrim()を使用して値の前後の半角スペースを除外する。
// 正しいコード // <div id="r"></div> function getCSV() { var req = new XMLHttpRequest(); req.open('get', 'sample.csv', true); req.send(null); req.onload = function() { setCSV(req.responseText); }; } function setCSV(str) { var data = []; var dataArr; var r = document.getElementById('r'); var tmp = str.split('\n'); tmp.forEach(x => { dataArr = x.split(','); if (dataArr[0]) { data.push(dataArr.map(x => x.trim())); } }); var t = '<dl>'; data.forEach(x => { t += `<dt>${x[0]}</dt><dd>価格は${x[1]}円</dd>`; }); t += '</dl>'; r.innerHTML = t; } getCSV();