2012-08-16 205 views
21

我尝试逐行读取文件,并使用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) { 
    console.log(line); 
     fs.open("./output.txt", 'a', 0666, function(err, fd) { 
      fs.writeSync(fd, line.toString() + "\n", null, undefined, function(err, written) { 
      })}); 
    } 
); 

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

回答

34

如果你写同步代码,只使用同步功能:

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

它是安全的混合同步和fs函数的异步版本,但是您仍然必须以正确的顺序设置回调 – 2012-08-16 12:41:04

+4

@AndreySidorov对于初学者来说,更容易不混合同步代码和异步代码,并选择单一方法。例如,OP以异步方式打开文件(这样就不会保留对“open”的调用顺序),但由于某种原因,它使用同步版本的“write”。 – penartur 2012-08-16 12:47:29

1

你为什么不使用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); 
    }); 
3

我想你想在每行上执行一些计算和/或转换。如果不是这样,简单的复制是一个班轮(看看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');