Не могли бы вы помочь мне со следующей проблемой.
Цель
Прочитайте файл на стороне клиента (в браузере через классы JS и HTML5), за строкой, без загрузки всего файла в память.
Сценарий
Я работаю на веб-странице, которая должна анализировать файлы на стороне клиента. В настоящее время я читаю файл, как описано в этой статье .
HTML:
<input type="file" id="files" name="files[]" />
JavaScript:
$("#files").on('change', function(evt){
// creating FileReader
var reader = new FileReader();
// assigning handler
reader.onloadend = function(evt) {
lines = evt.target.result.split(/\r?\n/);
lines.forEach(function (line) {
parseLine(...);
});
};
// getting File instance
var file = evt.target.files[0];
// start reading
reader.readAsText(file);
}
Проблема заключается в том, что FileReader считывает весь файл сразу, что приводит к сбою вкладок для больших файлов (размеp >= 300 МБ). Использование reader.onprogress
не решает проблему, так как она просто увеличивает результат, пока он не достигнет предела.
Изобретая колесо
Я провел некоторое исследование в Интернете и не нашел простого способа сделать это (есть куча статей, описывающих эту точную функциональность, но на стороне сервера для node.js).
Как единственный способ его решить, я вижу только следующее:
- Разделить файл кусками (с помощью метода
File.split(startByte, endByte)
) - Найти последний новый символ строки в этом фрагменте ('/n')
- Прочитайте этот фрагмент за исключением части после последнего нового символа строки и преобразуйте его в строку и разделите по строкам
- Прочитайте следующий фрагмент, начиная с последнего нового символа линии, найденного на шаге 2
Но я лучше использую то, что уже существует, чтобы избежать роста энтропии.