26

Node.jsを使用して、ファイルを1行ずつ読み取り、別のファイルに出力しようとしました。

私の問題は、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) {
            })});
    }
);

任意の考えをいただければ幸いです、ありがとう。

4

3 に答える 3

39

同期コードを作成している場合は、同期関数のみを使用してください。

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");
        });
});
于 2012-08-16T12:36:43.757 に答える
4

すべての行で計算や変換を実行したいと思います。そうでない場合、単純なコピーはワンライナーです ( 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();

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');
于 2012-08-16T12:39:23.263 に答える
1

同じために node.js プラグインを使用しないのはなぜですか: https://github.com/pvorb/node-read-files

インストール: npm install read-files

使用法:

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

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

      console.log(data);
  });
于 2012-08-16T12:02:15.167 に答える