1

我四处搜索并检查了一些 npm(例如 Lazy),但仍然找不到将字符串插入文件第 n 行的好模式。

作为 Nodejs 的新手,我想这可以像使用其他语言一样轻松完成,例如 PHP / Ruby。

提前感谢您的解决方案。

4

1 回答 1

1

你可以做的是:

  1. 以读取模式打开文件

`var fileData = fs.createReadStream('filename.extension');'

  1. 逐行读取并跟踪计数器
  2. 使用您所需的n-th行号检查此计数器
  3. 如果匹配: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]

其他方式:

逐行 npm

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");
        });
});

以读取模式打开文件并逐行检查所需的行,同时通过操作行将其写入另一个文件。

于 2013-11-10T09:18:35.127 回答