Nodejs如何轻松地将字符串插入第n行文件?

时间:2013-11-10 08:58:03

标签: node.js file-io

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

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

提前感谢您的解决方案。

1 个答案:

答案 0 :(得分:1)

你能做的是:

  1. 以读取模式打开文件
  2. `var fileData = fs.createReadStream(' filename.extension');'

    1. 逐行阅读并跟踪计数器
    2. 使用所需的n-th行号
    3. 检查此计数器
    4. 如果匹配:通过在附加模式下打开文件并遍历到计数器来追加行fileData.write("this is a message");。 如果没有匹配:打印"找不到这样的位置。错误&#34!; 我可能会使用其中一个输入流,在每行上通知我'模块,例如node-lazy或byline:

      var fs = require(' fs'),     byline = require(' byline');

      var stream = byline(fs.createReadStream(' sample.txt')); stream.on(' line',function(line){     //用线做东西 }); stream.pipe(fs.createWriteStream(' ./输出&#39);

    5. 如果您的文件很小,您可以简单地同步读取所有文件并将结果字符串拆分为:

      require('fs').readFileSync('abc.txt').toString().split('\n').forEach(function (line) { line; })[1]

      另一种方式:

      <强> Line-by-line 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");
              });
      });
      

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