前提・実現したいこと
XMLHttpRequestで読み込んだCSVを二次元配列に格納したいです。
発生している問題・エラーメッセージ
関数の外に定義したresultの中にCSVを配列で入れたいのですが、 関数の外でコンソールに出力すると、 [] 0:(2)["01",100] 1:(2)["02",200] ・ ・ ・ と出力されます。 最初の[]の中に何も入っていないので、 consol.log(result[1])などにしてもundifinedになります。 CSVを読み込んで同じように出力されるという質問を見つけたのですが、 関数の中でコンソール出力することで解決されていましたので、 配列の格納方法が分かりませんでした。 いろいろ試してみましたが、にっちもさっちもいかなくなりました。 javascriptを勉強をはじめたばかりです。 ご教示お願いいたします。
該当のソースコード
javascript
1let result =[] 2 3function getCSV(){ 4 const req = new XMLHttpRequest() 5 req.open("get","abc.csv",true) 6 req.send(null) 7 8 req.onload=function(){ 9 csvArray(req.responseText) 10 } 11} 12 13function csvArray(str){ 14 const temp = str.split("\r\n") 15 16 for(let i=0;i<temp.length;++i){ 17 result[i] =temp[i].split(",") 18 } 19} 20getCSV() 21 22console.log(result) //ここの出力でおかしくなります。 23
試したこと
getCSVの中にコンソールを書くと、同様の結果になり、
csvArrayの中にコンソールを書くと、(10)[Array(2),Array(2),・・・]と出力されました。
試しにCSV読み込みを無視して、tempを普通の配列にしてみたところ、
(10)[Array(2),Array(2),・・・]と出力されました。
csvArrayの中でresultを定義して、関数の外で定義したresultをresult2にして、
csvArrayの中でresult2=resultとしてみたところ、
[]
length:0
と出力されてしまいました。
##追記
昨日fetchの方が適しているとのご意見をいただき、調べながら確認したことをまとめます。
ご教示いただいた下記コードですが、
const getCSV=()=>fetch('sample.csv').then(res=>res.text()).then(csvArray);
const csvArray=str=>str.split("\r\n").map(x=>x.split(","));
(async ()=>{
const result=await getCSV();
console.log(result); ※1
})();
//↑この外でresultを参照できませんでした。
console.log(result) //Uncaught・・・
//※1では
//(5) [Array(2), Array(2), Array(2), Array(2), Array(2)]
//0: (2) ['"0001"', '11']
//1: (2) ['"0002"', '12']
//2: (2) ['"0003"', '13']
//3: (2) ['"0004"', '14']
//のように出力され、配列になっていました。
//そこで、resultを最初に定義してみましたが、
let result = []
const getCSV=()=>fetch('sample.csv').then(res=>res.text()).then(csvArray);
const csvArray=str=>str.split("\r\n").map(x=>x.split(","));
(async ()=>{
result=await getCSV();
console.log(result);
})();
console.log(result)
//以下のような出力結果になりました。
//[]
// length: 0
// [[Prototype]]: Array(0)
//(5) [Array(2), Array(2), Array(2), Array(2), Array(2)]
// 0: (2) ['"0001"', '11']
// 1: (2) ['"0002"', '12']
// 2: (2) ['"0003"', '13']
// 3: (2) ['"0004"', '14']
resultの中身が空のままになってしまいました。
resultを配列として別の関数で参照したり、result[1]などのように扱いたいので
グローバル変数としたいと思っています。
自分でも調べながらやってみたのですが、
let result = fetch("sample.csv").then(res=>res.text()).then(function convertCSVtoArray(str){
const temp = str.split("\r\n")
for(let i=0;i<temp.length;++i){
result[i] =temp[i].split(",")
}
})
console.log(result)
//↑のようにすると、以下のように出力されます。
//Promise {<pending>}
//0: (2) ['"0001"', '11']
//1: (2) ['"0002"', '12']
//2: (2) ['"0003"', '13']
//3: (2) ['"0004"', '14']
Promiseの概念がつかめていないままなのですが、
pendingとなっているということは、値は検出してるけど、
まだresultに取得できていないということでしょうか?
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー