2016-09-18 135 views
1

我正在嘗試閱讀超過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

回答

0

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

0

您的問題之一是與範圍界定有關。您在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; 
} 
相關問題