按行读取文件,基于文件可读流。
$ npm install fs-readline
或者直接从 GitHub 上安装。
$ npm install 52cik/fs-readline
var readLine = require('fs-readline');
var rl = readLine('./somefile.txt');
rl.on('line', function (line, idx) {
console.log(idx, line);
});
node 支持的编码非常有限, 对于那些不支持的编码可以使用一些第三方库转换, 例如 iconv-lite 模块。
PS: 记得加
retainBuffer
参数防止默认toString
哦。
var readLine = require('fs-readline');
var iconv = require('iconv-lite');
var rl = readline('./gbkfile.txt', {retainBuffer: true}); // buffer 模式
rl.on('line', function (data, idx){
var line = iconv.decode(data, 'gbk');
console.log(idx, line);
});
仅仅只有 4 个附加参数,其他参数继承自 fs.createReadStream
参数。
是否保留 Buffer 数据,而不是转为字符串,默认 false 转为字符串。
var readLine = require('fs-readline');
var rl = readLine('./somefile.txt', {retainBuffer: true}); // buffer 模式
rl.on('line', function (data, idx) {
console.log(idx, data.toString()); // 这里要手动 toString
});
blankLine 是否忽略空行,默认 true 不忽略。
假设有个 file.txt 文件,有如下 5 行内容。
// file.txt
111
222
333
var readLine = require('fs-readline');
var rl = readLine('./file.txt', {blankLine: false});
rl.on('line', function (line, idx) {
console.log(idx, line);
});
// 输出为:
// 1 '111'
// 3 '222'
// 5 '333'
行号依然是对应的行号,如果要得到连续的新行号,请自己计数。
maxLineLength 行缓冲大小,默认 8k,也就是一行最多只能容纳 8k 的字符内容。
截断模式,默认 false,需 maxLineLength 配合使用,直接看例子好了。
假设有个 file.txt 文件,有如下 5 行内容。
// file.txt
111111
22
333333
444
555555
var readLine = require('fs-readline');
var rl = readLine('./file.txt', {cutMode: true, maxLineLength: 4}); // 截断模式,一行最多容纳 4 个字符
rl.on('line', function (line, idx) {
console.log(idx, line);
});
/**
* 输出为:
* 1 '1111'
* 2 '22'
* 3 '3333'
* 4 '444'
* 5 '5555'
*/
非常简单直观,行长度超过 4 的都被截断了,在某些特定的场景下还是比较适用的。
假设有个 file.txt 文件,有如下 5 行内容。
// file.txt
111111
22
333333
444
555555
var readLine = require('fs-readline');
var rl = readLine('./file.txt');
rl.on('line', function (line, idx) {
console.log(idx, line);
if (idx == 3) { // 第三行后停止输出
this.abort(); // 调用终止方法
}
}).on('abort', function () {
console.log('读取已终止');
}).on('close', function () {
console.log('文件已关闭');
});
/**
* 输出为:
* 1 '1111'
* 2 '22'
* 3 '3333'
* 读取已终止
* 文件已关闭
*/