在将包含 100,000 行的 CSV 保存到 MongoDB 并在保存所有行后发出事件时遇到问题



我有一个超过 100,000 行的 CSV 文档,每行都包含每小时价格数据,需要将其保存为自己的数据库记录。 我希望此操作在保存每一行后通过 EventEmitter 发出一个事件,但是在保存所有行后,整个操作只是重复,我的终端再次显示"播种每小时价格 2000-当前"。 谁能帮我解决这个问题?

注意:我正在使用这个节点 csv 字符串包来处理 CSV

奖励:我想在 Heroku 上部署它,但尝试此操作偶尔会导致内存错误,所以如果您对如何解决这些问题有任何建议,将不胜感激:)

读取 CSV 文件,提交到另一个函数进行处理,然后等待回调...

// SEED - HourlyPrices
exports.seed_hourly_prices = function(req, res) {
        console.log("Seeding Hourly Prices 2000-Current");
        // Seed Historical Data 2000 - 2014
        fs.readFile(__dirname + '/../../csv/hourlyprices_2000_2014.csv', 'utf8', function (err, data) {
            if (err) { return console.log(err) };
            save_each_row(data, function(){ 
                console.log("Callback Heard");
                eventEmitter.emit('HistoricalDataSeeded');
            });
        });
}; // seed_hourly_price

处理并保存每一行

save_each_row = function(data, callback) {
CSV.forEach(data,',', function(row, index) {
    if(row[0] && row[1] && row[0].indexOf('*') === -1 && row[1].indexOf('-') === -1) { // 1 hour out of the year contains an asterisk, I don't know why, but it marks a duplicate.  Don't add this.
        var splitDate = row[0].split(/[ ]+/); 
        var hour                        = splitDate[1];
        var day                         = splitDate[0];
        var full_date                   = row[0];
        var price                       = parseFloat(row[1]).toFixed(2);
        var thirty_day_rolling_average  = parseFloat(row[2]).toFixed(2);
        var system_demand               = parseFloat(row[3]).toFixed(2);
        if (hour === "24") {
            date = new Date(day+" 00:00:00");
            date.setDate(date.getDate() + 1);
            date = moment.tz(date, 'America/Phoenix').format("YYYY-MM-DDTHH:mm:ss");
            // Change day, hour, full_date results
            var hour      = '00';
            var day       = moment.utc(date).format('MM/DD/YYYY');
            var full_date = day + " " + hour;
        } else {
            date = new Date(full_date + ":00:00");
            date = moment.tz(date, 'America/Phoenix').format("YYYY-MM-DDTHH:mm:ss");
        };
        // Save Data
        var hourlyprice = new HourlyPrice({
            date:                                     date, 
            day:                                      day,
            hour:                                     hour,
            full_date:                                full_date,
            price:                                    price,
            thirty_day_rolling_average:               thirty_day_rolling_average,
            system_demand:                            system_demand
        });
        hourlyprice.save(function(err, pp){
                if (err) {
                    console.log("ERROR==========================", err);
                    console.log(hourlyprice)
                };
        });
    } else {
        console.log("Ommitted Row:" + index, row);
    };
}); //CSV()
}; // save_each_row

> fs.readFile调用会将整个文件读入单个变量。 您需要将其拆分为一个数组,然后对其进行迭代,或者使用readline,byline或逐行等模块来创建流。

最新更新