Preciso ler alguns arquivos csv, fornecidos pelo usuário. Os arquivos são passados para a página / script usando um div de arrastar e soltar, que lida com a soltura do arquivo da seguinte maneira:
function handleFileDrop(evt) {
evt.stopPropagation();
evt.preventDefault();
var files = evt.dataTransfer.files; // FileList object.
...
}
Preciso analisar cada arquivo com uma biblioteca csv que o converte em uma matriz, mas também preciso controlar o nome do arquivo que estou analisando no momento. Aqui está o código que uso para analisar cada arquivo:
for(var x = 0; x < files.length; x++){
var currFile = files[x];
var fileName = currFile.name;
var reader = new FileReader();
reader.onload = (function(theFile){
return function(e){
var csvArr = CSV.csvToArray( e.target.result, ";", true );
console.log(csvArr);
};
})(currFile);
reader.readAsText(currFile);
}
Até isso, tudo funciona muito bem. O que eu preciso é também passar o nome do arquivo para o reader.onload
evento, por exemplo:
reader.onload = (function(theFile){
return function(e){
***** I need to have fileName value HERE *****
};
})(currFile);
É possível? Como posso fazer isso? Agradecemos antecipadamente por qualquer ajuda, cumprimentos
Respostas:
43 para resposta № 1Tente o seguinte:
var reader = new FileReader();
reader.onload = (function(theFile){
var fileName = theFile.name;
return function(e){
console.log(fileName);
console.log(e.target.result);
};
})(currFile);
reader.readAsText(currFile);
Aqui, você está criando um novo fileName
variável cada vez que um arquivo é passado para o método externo. Em seguida, você está criando uma função que tem acesso a essa variável (devido ao encerramento) e retornando-a.