我使用this example读取一个大文件:
var fs = require('fs');
var readline = require('readline');
var stream = require('stream');
var instream = fs.createReadStream('your/file');
var outstream = new stream;
var rl = readline.createInterface(instream, outstream);
rl.on('line', function(line) {
// process line here
});
rl.on('close', function() {
// do something on finish here
});
我想知道line
是文件的最后一行。我读了docs,但找不到解决方案。我已经试过了:
rl.on('line', function(line) {
if (line == '' || line == require("os").EOL)
console.log('eof');
});
但是没有用。
你有什么建议吗?感谢阅读。
6条答案
按热度按时间cidc1ykv1#
阿克塞尔的答案的问题在于他假设文件的最后一行是空的或者是EOL。事实并非如此。
用途:
v8wbuo2f2#
我在我的mocha测试套件中使用了
exec(tail -n 1 <filepath>)
,因为我确切地知道它做什么,而且它用更少的代码行就可以完成。不过,在构建应用程序时,它可能不太理想
a11xaf1n3#
将接收到的行保存在全局变量中,然后在到达文件末尾时显示它。
djp7away4#
为了高效地读取大文件的最后N行,我们可以使用这个npm包
read-last-lines
https://www.npmjs.com/package/read-last-lines
阅读文件最后50行的示例:
e7arh2l65#
保存当前行,当你到达文件的末尾时,你就有了最后一行。当输入流的所有数据都被消耗时,输入流发出“end”事件。https://nodejs.org/api/stream.html#stream_event_end
您也可以使用
rl.on('end')
事件,但它会因其他原因而触发,例如中断或调用rl.close()
,但这些可能不会影响您。https://nodejs.org/api/readline.html#readline_event_closektca8awb6#
为https://github.com/alexbbt/read-last-lines添加一个依赖项,并因此为
mz/fs
添加一个依赖项,对于一个函数来说似乎很多。另外,
read-last-lines
的代码似乎有点过时。我采用了read-last-lines
的代码,并对其进行了一点重构。所有的功劳都归于read-last-lines
。下面的代码基本上是从后到前逐个字符地读取文件,并计算遇到了多少个换行符。
我没有测试这是否真的比通过一个巨大的CSV文件的所有行的流更快。