【问题标题】:How to export in nodejs a csv file from nodejs with a PostgreSQL如何在 nodejs 中使用 PostgreSQL 从 nodejs 导出 csv 文件
【发布时间】:2014-03-19 16:30:40
【问题描述】:

nodejs 文件在 Heroku 上,我使用 PostgreSQL 作为数据库 我想从视图中导出 csv 文件:

// 我的 PostgreSQL 查询

var copyTo = require('pg-copy-streams').to; 
var csv = require('csv');
var fs = require('fs');

var stream =  client.query(copyTo('COPY (SELECT * FROM v_metric) TO
STDOUT WITH CSV HEADER DELIMITER as \'|\''));

//导出为csv

csv().from(stream.pipe(process.stdout,{ end: false)).to(fs.createWriteStream('sample.csv'))

我没有任何结果,sample.csv 为空。

有什么想法吗?

提前谢谢你

【问题讨论】:

    标签: node.js postgresql csv heroku


    【解决方案1】:

    您可以使用专门为此制作的pg-copy-streams npm 模块:

        let data = '', copyTo = require('pg-copy-streams').to;
        pool.connect(function(pgErr, client, done) {
          if(pgErr) {
            //handle error
            return;
          }
          var stream = client.query(copyTo(`COPY (${query}) TO STDOUT With CSV HEADER`));
          stream.on('data', chunk => {
            data += chunk;
          })
          stream.on('end', response => {
            console.log(data)
            done();
          });
          stream.on('error', err => {
            done();
          })
        })
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      SQL Server 的 STDOUT 将与您的节点进程的不同。你可以试试streaming the query results:

      var query = client.query('SELECT * FROM v_metric');
      query.on('row', function(row) {
          //handle the row here
      });
      

      然后在您的处理程序中,如果您的数据不复杂(即没有分隔符或双引号),您可以跳过使用 csv 并遍历列以将它们转换为您写入写入流的字符串。将列名放在数组中可能更容易,您可以将其作为 SQL 传递(通过与 ', ' 连接)并在处理程序中迭代,但您也可以使用 Object.keys(row) 提取列名。

      更新:基于您的评论的示例:

      var columns = ['country_cd','product_name','product_lvel','month_year','metric_name','val'];
      var ws = fs.createWriteStream('sample.csv');
      
      var query = client.query('SELECT '+columns.join(', ')+' FROM users');
      query.on('row', function(row) {
          var values = [];
          // process column values; if you need to do special formatting (i.e. dates) don't loop and instead handle each one specially
          columns.forEach(function(col) {
              values = row[col];
          });
          ws.write(values.join('| '));
      });
      
      query.on('end', function(result) {
          ws.close();
      });
      

      如果你确实想使用csv,你可以创建一个流,你可以在处理程序中写入数据并将其pip到csv

      另一个注意事项,, 是默认分隔符,因此如果您想使用其他内容,例如 |,则需要在选项中指定。

      【讨论】:

      • 感谢 Zugwalt 的快速回答,但我在 nodejs 方面没有太多经验,我不知道如何使用 '|' 编写 csv 文件,列是:Country_CD|PRODUCT_NAME|PRODUCT_LVEL| MONTH_YEAR|METRIC_NAME|VAL
      • 根据您的上述评论更新了非 csv 方式的示例(即数据的值中没有 "|)。
      猜你喜欢
      • 2017-04-04
      • 2013-08-20
      • 1970-01-01
      • 2019-01-31
      • 2021-02-22
      • 2021-12-13
      • 1970-01-01
      • 2017-04-06
      • 2014-05-29
      相关资源
      最近更新 更多