2012-08-16 17 views
21

Bir dosya satırını satır okumayı denedim ve başka bir dosyaya verdim, Node.js.Node.js dosya kodlarını oku ve yaz

Sorunum, zaman zaman Node.js. async doğası nedeniyle karışıklık sorun satırı sırasıdır. Benim girdi dosyası gibi mesela

: hat 1 hat 2 hattı 3

ancak çıktı dosyası olabilir gibi: hattı 1 satırı 3 hat 2

Aşağıda benim kodudur.

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

Herhangi bir düşünce takdir edilecektir, teşekkürler.

cevap

34

iseniz: npm salt dosyaları

Kullanımı yüklemek Eşzamanlı bir kod yazarken, yalnızca senkron işlevleri kullanın:

var fs = require("fs"); 

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

asenkron bir yaklaşım için,

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

o güvenli olduğunu fs işlevlerinin eşitleme ve uyumsuz sürümlerini karıştırın, ancak yine de doğru sırada geri aramaları ayarlamanız gerekiyor –

+4

@AndreySidorov Yeni başlayanlar için eşzamanlı ve eşzamansız kodları karıştırmamak ve tek bir yaklaşım seçmek daha kolay. Örneğin, OP, senkronize olmayan bir dosyayı açar (böylece "açık" arama sırası korunmaz), ancak bir nedenden dolayı, "write" ın eşzamanlı sürümünü kullanır. – penartur

1

Neden aynı için eklenti node.js kullanmayın: https://github.com/pvorb/node-read-files

Kurulum:

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

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

     console.log(data); 
    }); 
3

gibi bir şey yazabilirsiniz seni her satırda bazı hesaplamalar ve/veya dönüşümleri gerçekleştirmek istediğiniz varsayalım. Değilse, basit kopya one-liner (createReadStream documentation bakmak)

fs.createReadStream('./input.txt').pipe(fs.createWriteStream('./output.txt')); 

Şimdi, dosyayı size satırı yazmak istediğiniz her zaman açmaya çalıştığınız, ve evet, sipariş burada tahmin edilemez. kodunuzun Daha doğru versiyon:

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

Herhalde 'verilen giriş akımının her satırda bana bildir' birini kullanmak örneğin node-lazy veya byline için, modüller ediyorum:

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