2015-05-25 14 views
1

現在,許多瀏覽器都支持使用HTML5的FileReader讀取本地文件,這爲網站打開了超越「數據庫前端」的腳步,一些有用的本地數據,而不必先發送到服務器。逐行讀取FileReader對象,無需將整個文件加載到RAM中

在上傳之前預處理圖片和視頻,FileReader的一個大應用程序將從某種磁盤表格(CSV,TSV,無論)中加載數據到瀏覽器進行操作 - 可能用於繪圖或分析D3.js或在WebGL中創建風景。

問題是,StackOverflow和其他站點上的大多數示例都使用FileReader的.readAsText()屬性,該屬性在返回結果之前將整個文件讀入RAM。

javascript: how to parse a FileReader object line by line

要讀取一個文件,而無需將數據裝入RAM,一個需要使用.readAsArrayBuffer(),而這SO職位是最接近我能得到一個很好的答案:

filereader api on big files

但是,這個問題有點過於具體,並且誠實地說,我可以嘗試幾天來使解決方案更加普遍,並且因爲我不瞭解塊大小的意義而空手而出或者爲什麼使用Uint8Array。解決更一般的問題,即使用用戶可定義的行分隔符逐行讀取文件(理想情況下使用.split(),因爲它也接受正則表達式),然後每行執行一些操作(如將其打印到console.log)將是理想的。

+0

「A溶液到的使用用戶可定義的在線分離器(理想地.split(),因爲在讀取線由行一個文件中的更一般的問題也接受正則表達式)「如果你可以使用拆分,你已經加載了整個文件... – n00dl3

+0

如果你在閱讀它時分割成塊,那麼不需要它:) 說,讀取1Mb,拆分,處理行, 1Mb,沖洗重複:) –

+1

您使用Uint8Array(或node.js中的緩衝區)的原因是因爲文件可能是b inary和javascript字符串不能處理二進制數據(例如,字節0x00,否則稱爲nul終止符(是的,這是nul和一個「l」)) – slebetman

回答

6

我在下面的Gist URL中創建了一個LineReader類。正如我在評論中提到的,使用其他行分隔符比LF,CR/LF和CR可能不常見。因此,我的代碼只考慮LF和CR/LF作爲行分隔符。

https://gist.github.com/peteroupc/b79a42fffe07c2a87c28

實施例:

new LineReader(file).readLines(function(line){ 
console.log(line); 
}); 
+0

真棒解決方案彼得!這很好用!我希望它得到很多關注:) 我從來沒有捐贈給一個SO答案要求,但這次你的解決方案絕對值得它:)謝謝! –

+0

這是真棒彼得。當所有的閱讀完成後,是否可以撥打電話? – Noitidart

+1

@Noitidart:我希望,我已經更新了我的要點,添加了可以做你想做的事情的功能。請注意,它僅在原地進行了編輯,並且未對功能進行測試。 –