我有一个超过 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或逐行等模块来创建流。