我四处搜索并检查了一些 npm(例如 Lazy),但仍然找不到将字符串插入文件第 n 行的好模式。
作为 Nodejs 的新手,我想这可以像使用其他语言一样轻松完成,例如 PHP / Ruby。
提前感谢您的解决方案。
你可以做的是:
`var fileData = fs.createReadStream('filename.extension');'
n-th
行号检查此计数器如果匹配:fileData.write("this is a message");
通过以追加模式打开文件并遍历计数器来追加该行。如果不匹配:打印“没有找到这样的位置。错误!” 我可能会使用“给定输入流,在每一行通知我”模块之一,例如 node-lazy 或 byline:
var fs = require('fs'), byline = require('byline');
var stream = byline(fs.createReadStream('sample.txt')); stream.on('line', function(line) { // 用 line 做事 }); stream.pipe(fs.createWriteStream('./output');
如果您的文件很小,您可以简单地同步读取所有文件并拆分结果字符串,如下所示:
require('fs').readFileSync('abc.txt').toString().split('\n').forEach(function (line) { line; })[1]
其他方式:
var LineByLineReader = require('line-by-line'),
var lr = new LineByLineReader('big_file.txt');
lr.on('error', function (err) {
// 'err' contains error object
});
lr.on('line', function (line) {
// pause emitting of lines...
lr.pause();
// ...do your asynchronous line processing..
setTimeout(function () {
// ...and continue emitting lines.
lr.resume();
}, 100);
});
lr.on('end', function () {
// All lines are read, file is closed now.
});
您的节点惰性方式:
var lazy = require("lazy"),
fs = require("fs");
var matched_line_number = 10;// let say 10, can be any
new lazy(fs.createReadStream('./MyVeryBigFile.extension'))
.lines
.forEach(function(line){
console.log(line.toString());
ctr++;
}
);
另一种方法可能是:
var fs = require('fs'),
async = require('async'),
carrier = require('carrier');
async.parallel({
input: fs.openFile.bind(null, './input.txt', 'r'),
output: fs.openFile.bind(null, './output.txt', 'a')
}, function (err, result) {
if (err) {
console.log("An error occured: " + err);
return;
}
carrier.carry(result.input)
.on('line', result.output.write)
.on('end', function () {
result.output.end();
console.log("Done");
});
});
以读取模式打开文件并逐行检查所需的行,同时通过操作行将其写入另一个文件。