Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js nodejs读取多个csv文件,计算行数,并在最后生成和总计数_Node.js - Fatal编程技术网

Node.js nodejs读取多个csv文件,计算行数,并在最后生成和总计数

Node.js nodejs读取多个csv文件,计算行数,并在最后生成和总计数,node.js,Node.js,我有下面的Nodejs代码。我的意图是生成所有文件中所有行的单个计数。然而,当我运行这段代码时,我只收到最小文件的计数 我想我明白为什么。所有6个文件读取都会快速连续启动,自然,最短的文件会首先完成,而不会等待所有其他计数完成 我的问题是:解决这个问题的最佳Nodejs方法是什么?在现实生活中,我想做一个比每次递增计数器更复杂的操作,但这一点让我明白了 我应该以某种方式使用承诺来实现这一点,或者是关闭其他类型的事件 var fs = require("fs"); var readline = r

我有下面的Nodejs代码。我的意图是生成所有文件中所有行的单个计数。然而,当我运行这段代码时,我只收到最小文件的计数

我想我明白为什么。所有6个文件读取都会快速连续启动,自然,最短的文件会首先完成,而不会等待所有其他计数完成

我的问题是:解决这个问题的最佳Nodejs方法是什么?在现实生活中,我想做一个比每次递增计数器更复杂的操作,但这一点让我明白了

我应该以某种方式使用承诺来实现这一点,或者是关闭其他类型的事件

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

就我的问题而言,我的用例正如我所说的那样。我想更正我写的代码。我认为它的缺陷在于,它假设在初始数组中的最后一个文件关闭后,它可以发出总计。但实际上,我想在所有文件关闭后发出总计。