2012-08-16 203 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');