[英]Node.js read and write file lines
我嘗試逐行讀取文件,並使用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) {
})});
}
);
任何想法都將不勝感激,謝謝。
如果您正在編寫同步代碼,請僅使用同步函數:
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");
});
});
我想你想在每一行上進行一些計算和/或轉換。 如果沒有,簡單的副本是一行的(看看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');
為什么不使用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);
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.