Javascript Node.js 读写文件行

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11986350/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-24 07:56:13  来源:igfitidea点击:

Node.js read and write file lines

javascriptnode.js

提问by jnj

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

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

My problem is the sequence of lines sometimes messed up due to async nature of Node.js.

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

eg my input file is like: line 1 line 2 line 3

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

but output file could be like: line 1 line 3 line 2

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

Below is my code.

下面是我的代码。

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

Any thoughts would be appreciated, thanks.

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

回答by penartur

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

回答by Andrey Sidorov

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)

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

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-lazyor byline:

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

回答by codef0rmer

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

为什么不使用 node.js 插件:https: //github.com/pvorb/node-read-files

Installation:npm install read-files

安装: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);
  });