【发布时间】:2017-01-21 14:09:27
【问题描述】:
我拥有的最小文件有 > 850k 行,每行的长度未知。目标是在浏览器中从此文件中读取n 行。完全阅读它是不可能的。
这是 HTML <input type="file" name="file" id="file"> 和我拥有的 JS:
var n = 10;
var reader = new FileReader();
reader.onload = function(progressEvent) {
// Entire file
console.log(this.result);
// By lines
var lines = this.result.split('\n');
for (var line = 0; line < n; line++) {
console.log(lines[line]);
}
};
很明显,这里的问题是它首先尝试真实的整个文件,然后用换行符分割它。所以不管n,它都会尝试读取整个文件,最终当文件很大时什么都不读取。
我该怎么做?
注意:我愿意删除整个函数并从头开始,因为我将能够console.log() 我们阅读的每一行。
*"每一行的长度未知" -> 表示文件是这样的:
(0, (1, 2))
(1, (4, 5, 6))
(2, (7))
(3, (8))
编辑:
要走的路类似于filereader api on big files,但我不知道如何修改它以读取文件的n 行...
也可以使用Uint8Array to string in Javascript,从那里开始:
var view = new Uint8Array(fr.result);
var string = new TextDecoder("utf-8").decode(view);
console.log("Chunk " + string);
但这可能不会将最后一行作为一个整体读取,那么您以后将如何确定这些行呢?例如这里是它打印的内容:
((7202), (u'11330875493', u'2554375661'))
((1667), (u'9079074735', u'6883914476',
【问题讨论】:
-
"...但这不重要。" 天哪,你认为这不重要吗?!如果没有行开始位置的索引和在给定索引处增量读取文件的能力,这绝对很重要。
-
@T.J.Crowder 我更新了我的问题以澄清,也许我应该删除该声明,你是对的!
-
这里需要更多上下文。您正在使用 HTML 和 JavaScript。这是在网络浏览器中运行的 JavaScript 吗?或者这个 JavaScript 是作为来自 HTML POST 之类的响应而执行的?
-
啊忘了@Alan,更新了!在浏览器中。
-
看看这个 StackOverflow 的答案,它很相似:stackoverflow.com/questions/25810051/… 它的要点是使用 .slice,以块的形式读取数据。然后随时处理每个块。
标签: javascript html file io bigdata