Node.js read and write file lines

前端 未结 3 1263
甜味超标
甜味超标 2020-12-13 03:10

I tried to read a file line by line, and output it to another file, using Node.js.

My problem is the sequence of lines sometimes messed up due to async nature of Nod

相关标签:
3条回答
  • 2020-12-13 03:27

    I suppose you want to perform some calculations and/or transformations on every line. If not, simple copy is one-liner (take a look at createReadStream documentation)

    fs.createReadStream('./input.txt').pipe(fs.createWriteStream('./output.txt'));
    

    Now, you are trying to open file each time you want to write line, and yes, order is unpredictable here. More correct version of your code:

    var lines = fs.readFileSync('./input.txt').toString().split('\n')
    function writeLineFromArray(lines) {
        var line = arr.shift();
        fs.open("./output.txt", 'a', 0666, function(err, fd) {
            fs.writeSync(fd, line + '\n', null, undefined, function(err, written) {
               writeLineFromArray(lines);
            });
        }); 
    }
    writeLinesFromArray();
    

    I'd probably use one of 'given input stream, notify me on each line' modules, for example node-lazy or byline:

    var fs = require('fs'),
        byline = require('byline');
    
    var stream = byline(fs.createReadStream('sample.txt'));
    stream.on('line', function(line) { 
        // do stuff with line
    });
    stream.pipe(fs.createWriteStream('./output');
    
    0 讨论(0)
  • 2020-12-13 03:51

    If you're writing a synchronous code, use only the synchronous functions:

    var fs  = require("fs");
    
    fs.readFileSync('./input.txt').toString().split('\n').forEach(function (line) { 
        console.log(line);
        fs.appendFileSync("./output.txt", line.toString() + "\n");
    });
    

    For asynchronous approach you could write something like

    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");
            });
    });
    
    0 讨论(0)
  • 2020-12-13 03:53

    Why do not you use node.js plugin for the same: https://github.com/pvorb/node-read-files

    Installation: npm install read-files

    Usage:

      var fs = require("fs");
          require("read-files");
    
      fs.readFiles([ "file1", "file2" ], "utf8", function(err, data) {
          if (err) throw err;
    
          console.log(data);
      });
    
    0 讨论(0)
提交回复
热议问题