【发布时间】:2011-09-03 15:09:23
【问题描述】:
我正在尝试一次读取一个大文件。我找到了处理这个主题的a question on Quora,但我缺少一些联系以使整个事情融合在一起。
var Lazy=require("lazy");
new Lazy(process.stdin)
.lines
.forEach(
function(line) {
console.log(line.toString());
}
);
process.stdin.resume();
我想弄清楚的是如何从文件中一次读取一行,而不是像本示例中那样从 STDIN 读取。
我试过了:
fs.open('./VeryBigFile.csv', 'r', '0666', Process);
function Process(err, fd) {
if (err) throw err;
// DO lazy read
}
但它不起作用。我知道在紧要关头我可以回退到使用 PHP 之类的东西,但我想弄清楚这一点。
我不认为其他答案会起作用,因为文件比我运行它的服务器大得多。
【问题讨论】:
-
仅使用低级别的
fs.readSync()是相当困难的。您可以将二进制八位字节读入缓冲区,但在将缓冲区转换为 JavaScript 字符串并扫描 EOL 之前,如果不检查缓冲区,则无法轻松处理部分 UTF-8 或 UTF-16 字符。Buffer()类型没有像原生字符串那样丰富的函数集来对其实例进行操作,但原生字符串不能包含二进制数据。在我看来,缺乏从任意文件句柄读取文本行的内置方法是 node.js 中的一个真正差距。 -
通过此方法读入的空行将转换为其中包含单个 0(0 的实际字符代码)的行。我不得不破解这条线:
if (line.length==1 && line[0] == 48) special(line); -
也可以使用'line-by-line'包,它可以完美地完成这项工作。
-
请更新问题以说明解决方案是使用transform stream
-
@DanDascalescu 如果您愿意,可以将其添加到列表中:您的示例在
node的API 文档github.com/nodejs/node/pull/4609 中稍作修改
标签: javascript node.js file-io lazy-evaluation