【问题标题】:Nodejs CSV data export system for users面向用户的 Nodejs CSV 数据导出系统
【发布时间】:2013-06-19 09:58:30
【问题描述】:

我需要允许用户以 csv 格式导出他们的数据。我在 nodejs 中编写了应用程序。用户的导出数据可能非常庞大。所以我想知道如何在nodejs中处理这种情况。我应该使用nodejs的process.nexttick还是子进程api?也有什么好的模块可用于 nodejs 将数据从 mysql 转换为 csv。

【问题讨论】:

  • 数据巨大是什么意思?您是否正在运行应根据请求导出该数据的 Web 应用程序?我可以肯定地告诉你的一件事是你不应该使用 process.nextTick。使用流(从 db 流到您的 csv 生成器到您的客户端)
  • 我的意思是数据可能很大,比如 10-20 MB 或更多
  • 你需要实时创建csv吗?
  • 不,实际上我可以在流程完成后向用户发送电子邮件

标签: node.js csv


【解决方案1】:

从你的mysql-db中逐行读取,并逐行追加到你的文件中

我对 mysqlmodule 了解不多,所以我假设这里的每一行只是一个数组,因此是 'row.join(';')'。如果不是这样(也许它是一个对象),你应该修复它。

var fs = require('fs');
var connection = require('mysql').createConnection({yourdbsettingshere});

function processRow (row) {
  fs.appendFile('your-file.csv', row.join(';'), function (err) {
    connection.resume();
  });
}

var query = connection.query('SELECT * FROM WHATEVER');

query
  .on('error', function(err) {
    // do something when an error happens
  })
 .on('fields', function(fields) {
   processRow(fields);
 })
 .on('result', function(row) {
   // Pausing the connnection is useful if your processing involves I/O
   connection.pause();
   processRow(row, function (err) {
     connection.resume();
   });
 })
 .on('end', function() {
    // now you can mail your user
 });

如果您有很多请求,您可以使用compute-cluster 模块来分配您的工作负载

【讨论】:

  • 感谢您的回答。我现在正在尝试。你认为我们也可以使用github.com/koles/ya-csv这个模块吗?
  • 另外我想问我是否应该在 processes.nexttick 中执行此过程?还是子进程?
  • 阅读我回答的最后一行!计算集群使用子进程。如果您停留在同一进程中,则可以对每个新的 csv-generation-start 使用 process.nextTick
  • 这会在每一行写入文件吗?
  • 我的示例代码?是的!阅读 fs.appendFile 在这里做了什么:nodejs.org/api/…
【解决方案2】:

接受的答案不起作用,因为 CSV 文件由 , 而不是 ; 分隔。此外,每行末尾没有换行符\n,并且fields 对象包含有关column attributes 而不是data rows 的信息。 results 包含查询产生的行。因此,我编写了自己的代码来生成 CSV 文件。如果您需要更多解释,请发表评论,我会提供。

pool.query('SELECT * FROM category', function (error, results, fields) {
 var reportFile = Date.now();
 fs.closeSync(fs.openSync(__dirname + '/../reports/' + reportFile + '.csv', 'w'));
 var attributes = [];
 var row = [];
 for(var x = 0; x<fields.length; x++) attributes.push(fields[x].name);
 fs.appendFile(__dirname + '/../reports/' + reportFile + '.csv', attributes.join(','), function (err) {
    if(err) console.log('Error appending fields', err);
    fs.appendFileSync(__dirname + '/../reports/' + reportFile + '.csv', '\n');
    for(var x = 0; x<results.length; x++) {
        row = [];
        for(var y = 0; y<attributes.length; y++){
            row.push(results[x][attributes[y]]);
        }
        fs.appendFileSync(__dirname + '/../reports/' + reportFile + '.csv', row.join(','));
        fs.appendFileSync(__dirname + '/../reports/' + reportFile + '.csv', '\n');
    }
    req.reportFile = reportFile;
    next();
 });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    相关资源
    最近更新 更多