如何将文本文件内容保存为Javascript变量?

问题描述:

我正在尝试阅读超过150,000行文本的文本文件。我希望能够读取文本文件并将其作为processFileContent的参数传递。如何将文本文件内容保存为Javascript变量?

我试过这种方式,但它不起作用。另外,有没有更好的方法来处理这些大数据?

function readFile(file) { 
    var reader = new FileReader(); 
    reader.onload = function (evt) { 
    var data = evt.target.result; 
}; 
    reader.readAsText(file); 
    return data; 
} 

document.getElementById('file').addEventListener('change', readFile, false); 

var data = readFile(); 

function processFileContent(data) { 
    var list = data.split('\n'); 
    ... 
+0

_“另外,有没有更好的方法来处理这些大数据?”_您是否意味着更好的方式来处理数据? – guest271314

+0

是的,也许更有效的方法? – RJK

+0

不确定在'processFileContent'内发生了什么?,但是您应该可以读取以'\ n'结尾的一行到n行块中的数据',而不是为所有数据调用'.split()' “一次电话。不确定如何衡量“效率”?相比于其他的过程? – guest271314

FileReader.onload事件以异步方式返回结果。您可以使用回拨或PromiseFileReaderresult返回processFileContentfilereadFile将是event对象,而不是.files财产event.target

function readFile(event) { 
    var file = event.target.files[0]; 
    if (file) { 
    new Promise(function(resolve, reject) { 
     var reader = new FileReader(); 
     reader.onload = function (evt) { 
     resolve(evt.target.result); 
     }; 
     reader.readAsText(file); 
     reader.onerror = reject; 
    }) 
    .then(processFileContent) 
    .catch(function(err) { 
     console.log(err) 
    }); 
    } 
} 

document.getElementById('file') 
.addEventListener('change', readFile, false); 

function processFileContent(data) { 
    var list = data.split('\n'); 
    ... 
+0

plnkr http://plnkr.co/edit/teIuqiZJAGaJaJWhurBC?p=preview – guest271314

+0

谢谢你这个作品 – RJK

您的问题之一是与范围界定有关。您在onload事件处理函数中将data声明为局部变量,并试图将其从外部函数返回,其中它是undefined。为了解决这个问题,你需要将变量声明移出事件处理程序。

您也正在期待一个文件作为您的事件处理程序的参数,但是事件将Event对象传递给它们的事件处理程序。要获取该文件,您需要获得event.target.files[0]。这应该解决它。

function readFile(event) { 
    var file = event.target.files[0]; // getting the file Blob 
    var reader = new FileReader(); 
    var data; // moved declaration 
    reader.onload = function (evt) { 
     data = evt.target.result; 
    }; 
    reader.readAsText(file); 
    return data; 
}