Node.js nodejs读取多个csv文件,计算行数,并在最后生成和总计数
我有下面的Nodejs代码。我的意图是生成所有文件中所有行的单个计数。然而,当我运行这段代码时,我只收到最小文件的计数 我想我明白为什么。所有6个文件读取都会快速连续启动,自然,最短的文件会首先完成,而不会等待所有其他计数完成 我的问题是:解决这个问题的最佳Nodejs方法是什么?在现实生活中,我想做一个比每次递增计数器更复杂的操作,但这一点让我明白了 我应该以某种方式使用承诺来实现这一点,或者是关闭其他类型的事件Node.js nodejs读取多个csv文件,计算行数,并在最后生成和总计数,node.js,Node.js,我有下面的Nodejs代码。我的意图是生成所有文件中所有行的单个计数。然而,当我运行这段代码时,我只收到最小文件的计数 我想我明白为什么。所有6个文件读取都会快速连续启动,自然,最短的文件会首先完成,而不会等待所有其他计数完成 我的问题是:解决这个问题的最佳Nodejs方法是什么?在现实生活中,我想做一个比每次递增计数器更复杂的操作,但这一点让我明白了 我应该以某种方式使用承诺来实现这一点,或者是关闭其他类型的事件 var fs = require("fs"); var readline = r
var fs = require("fs");
var readline = require('readline');
var TOTAL_LINES = 0;
allCSVFiles = ["a", "b", "c", "d", "e", "f"];
allCSVFiles.forEach(function(file, idx, array){
var pathToFile = `/scratch/testDir/${file}.csv`;
var rd = readline.createInterface({
input: fs.createReadStream(pathToFile),
// output: process.stdout,
console: false
});
rd.on('line', function(line) {
TOTAL_LINES++;
})
.on('close', function() {
console.log (`closing: ${pathToFile}`);
if (idx === array.length - 1){
console.log (`Grand total: ${TOTAL_LINES}`);
}
})
});
是的,您可以使用promise异步读取文件。由于Node.js的异步特性,仅使用fs.readFile将导致异步处理所有文件 参考: 此示例演示如何创建一个totalsummary空文件,然后如何继续为每个承诺完成追加文件。在您使用promise的情况下,在附加到目标摘要文件之前,请读取现有文件内容以捕获上一行计数,然后进行求和,并根据汇总的总数更新文件 建议:如果您有一个长时间运行的计算,您应该使用child_process creation启动另一个进程进行并行处理,然后让node.js进程异步等待结果 参考:
所以请解释一下你的用例 好吧,我想我对自己的问题有了答案。请随意评论一下
var fs = require("fs");
var readline = require('readline');
var TOTAL_LINES = 0;
var allMyPromises = [];
allCSVFiles = ["a", "b", "c", "d", "e", "f"];
allCSVFiles.forEach(function(file, idx, array){
var myPromise = readOneFile (file, idx, array);
allMyPromises.push (myPromise);
});
Promise.all(allMyPromises).then(function(values) {
console.log (`Grand total: ${TOTAL_LINES}`);
});
function readOneFile(file,idx, array){
return new Promise(function(resolve, reject) {
var pathToFile = `/scratch/testDir/${file}.csv`;
var rd = readline.createInterface({
input: fs.createReadStream(pathToFile),
// output: process.stdout,
console: false
});
rd.on('line', function(line) {
TOTAL_LINES++;
})
.on('close', function() {
console.log (`closing: ${pathToFile}`);
resolve (TOTAL_LINES);
})
}
)
}
就我的问题而言,我的用例正如我所说的那样。我想更正我写的代码。我认为它的缺陷在于,它假设在初始数组中的最后一个文件关闭后,它可以发出总计。但实际上,我想在所有文件关闭后发出总计。