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) {
})});
}
);
Любые мысли будут оценены, спасибо.
Ответы
Ответ 1
Если вы пишете синхронный код, используйте только синхронные функции:
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");
});
});
Ответ 2
Я предполагаю, что вы хотите выполнить некоторые вычисления и/или преобразования на каждой строке. Если нет, простая копия - однострочный (посмотрите документацию 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-lazy или 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');
Ответ 3
Почему бы вам не использовать плагин 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);
});