【问题标题】:Node.js read and write file linesNode.js 读写文件行
【发布时间】:2012-08-16 11:42:12
【问题描述】:

我尝试使用 Node.js 逐行读取文件,并将其输出到另一个文件。

我的问题是,由于 Node.js 的异步特性,行的顺序有时会混乱。

例如我的输入文件是这样的: 1号线 2号线 第 3 行

但是输出文件可能是这样的: 1号线 3号线 第 2 行

下面是我的代码。

var fs  = require("fs");
var index = 1;

fs.readFileSync('./input.txt').toString().split('\n').forEach(
function (line) { 
    console.log(line);
        fs.open("./output.txt", 'a', 0666, function(err, fd) {
            fs.writeSync(fd, line.toString() + "\n", null, undefined, function(err, written) {
            })});
    }
);

任何想法将不胜感激,谢谢。

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    如果您正在编写同步代码,请仅使用同步函数:

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

    对于异步方法,您可以编写类似

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

    【讨论】:

    • 混合使用同步和异步版本的 fs 函数是安全的,但您仍然必须按正确的顺序设置回调
    • @AndreySidorov 对于初学者来说,不要混合同步和异步代码并选择单一方法会更容易。例如,OP 以异步方式打开文件(因此不会保留对open 的调用顺序),但随后出于某种原因使用了write 的同步版本。
    【解决方案2】:

    我想您想在每一行上执行一些计算和/或转换。如果没有,简单的复制是单行的(看看createReadStream documentation

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

    现在,您每次想要写行时都尝试打开文件,是的,这里的顺序是不可预测的。 更正确的代码版本:

    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();
    

    我可能会使用“给定输入流,在每一行通知我”模块之一,例如 node-lazybyline

    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');
    

    【讨论】:

      【解决方案3】:

      你为什么不使用 node.js 插件来做同样的事情:https://github.com/pvorb/node-read-files

      安装: npm install read-files

      用法:

        var fs = require("fs");
            require("read-files");
      
        fs.readFiles([ "file1", "file2" ], "utf8", function(err, data) {
            if (err) throw err;
      
            console.log(data);
        });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-08
        • 2020-10-15
        • 1970-01-01
        • 1970-01-01
        • 2020-04-26
        • 2019-02-17
        相关资源
        最近更新 更多