我正在使用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');
});
但它没有用。
你有什么建议吗。谢谢你的阅读。
答案 0 :(得分:5)
将您收到的行保存在全局变量中,然后在到达文件末尾时显示它。
var lastLine = '';
rl.on('line', function(line) {
if (line == '' || line == require("os").EOL) {
console.log('eof, last line is', lastLine);
return;
}
lastLine = line;
});
答案 1 :(得分:2)
Axel回答的问题是他认为文件的最后一行是空的还是EOL。事实并非如此。
// fileTools.js
const fs = require('fs');
const readline = require('readline');
const Stream = require('stream');
exports.getLastLine = (fileName, minLength) => {
let inStream = fs.createReadStream(fileName);
let outStream = new Stream;
return new Promise((resolve, reject)=> {
let rl = readline.createInterface(inStream, outStream);
let lastLine = '';
rl.on('line', function (line) {
if (line.length >= minLength) {
lastLine = line;
}
});
rl.on('error', reject)
rl.on('close', function () {
resolve(lastLine)
});
})
}
使用:
const getLastLine = require('./fileTools.js').getLastLine
const fileName = 'C:\\someWinDir\\somelog.log'
const minLineLength = 1
getLastLine(fileName, 1)
.then((lastLine)=> {
console.log(lastLine)
})
.catch((err)=> {
console.error(err)
})
答案 2 :(得分:0)
保存当前行,到达文件末尾时,显示最后一行。输入流的所有数据均被消耗时,将发出“结束”事件。 https://nodejs.org/api/stream.html#stream_event_end
var currentLine;
instream.on('end', function() {
// use currentLine here
});
rl.on('line', function(line) {
currentLine = line;
// process line normally
});
您也可以使用rl.on('end')
事件,但是它出于其他一些原因而发出,例如中断或调用rl.close()
,但这些事件可能不会影响您。
https://nodejs.org/api/readline.html#readline_event_close
答案 3 :(得分:0)
我在Mocha测试套件中使用了exec(tail -n 1 <filepath>)
,因为我确切地知道它的作用,并且用更少的代码行就可以完成它。
虽然在构建应用程序时可能不是最佳选择
const { exec } = require("child_process");
exec("tail -n 1 nginx_access.log", (error, stdout, stderr) => {
console.log(stdout)
})
答案 4 :(得分:0)
为了高效读取大文件的最后 N 行,我们可以使用这个 npm 包 read-last-lines
https://www.npmjs.com/package/read-last-lines
读取文件最后 50 行的示例:
const readLastLines = require('read-last-lines');
readLastLines.read('path/to/file', 50)
.then((lines) => console.log(lines));