Node.js读取和写入文件行

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

我的问题是由于Node.js的asynchronous性质,有时会混淆线条的顺序。

例如我的input文件是这样的:第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) { })}); } ); 

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

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

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

对于asynchronous方法,你可以写类似的东西

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

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

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

我可能会使用'给定的inputstream,通知我在每一行'模块,例如节点懒惰或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'); 

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

安装: npm安装读取文件

用法:

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