Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js读取和写入文件行_Javascript_Node.js - Fatal编程技术网

Javascript Node.js读取和写入文件行

Javascript Node.js读取和写入文件行,javascript,node.js,Javascript,Node.js,我试图逐行读取一个文件,并使用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) { c

我试图逐行读取一个文件,并使用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) {
            })});
    }
);

如果您有任何想法,我们将不胜感激。

为什么不使用node.js插件来实现同样的目的:

安装:npm安装读取文件

用法:

  var fs = require("fs");
      require("read-files");

  fs.readFiles([ "file1", "file2" ], "utf8", function(err, data) {
      if (err) throw err;

      console.log(data);
  });

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

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

我想您需要对每一行执行一些计算和/或转换。如果不是,简单副本就是一行(请看)

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

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();
我可能会使用“给定输入流,每行通知我”模块之一,例如:


混合使用fs函数的同步和异步版本是安全的,但是您仍然必须以正确的方式设置回调order@AndreySidorov对于初学者来说,不混合使用同步和异步代码并选择单一方法更容易。例如,OP以异步方式打开文件(这样就不会保留对
open
的调用顺序),但出于某种原因,它会使用同步版本的
write
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();
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');