如何使用Node.js将对象数组正确转换为CSV文件?

时间:2015-07-16 15:25:56

标签: node.js mongodb csv

我需要执行mongo查询并将结果转换为CSV文件。我遇到了node-csv,但我无法弄清楚如何将查询结果传递给此模块以进行转换并实际生成文件。

所以我已经阅读了这篇文章(根据我的查询示例调整我的代码):

var generate = require('csv-generate');

var generator = generate({objectMode: true, headers: 7});

var columns = {
  _id: '_id',
  first_name: 'first_name',
  last_name: 'last_name',
  team: 'team.name',
  position: 'position',
  status: 'status'
};
var stringifier = stringify({ header: true, columns: columns });

generator.pipe(stringifier).pipe(process.stdout);

我的查询如下:

Player.find({},{_id: true, first_name: true, last_name: true, "team.name": true, position: true, status:true}).exec(function (err,players){
  // Should CONVERT to CSV string AND generate file HERE
});

但是我真的无法弄清楚我应该遵循哪些步骤来生成CSV字符串并将其转换为示例中的文件。

3 个答案:

答案 0 :(得分:1)

使用mongoose,您可以使用stream()方法获得可读的流。然后用csv转换流管道它:

  var stringifier = csv.stringify({ header: true, columns: columns });
  Player.find()
  .stream()
  .pipe(csv.transform(function(record){
    record = record.toObject() //convert mongoose document to JS object
    return Object.keys(record).map(function(key){return record[key]}) // return array of columns
  }))
  .pipe(stringifier)
  .pipe(fs.createWriteStream('out.csv'));

答案 1 :(得分:1)

您也可以简单地从“csv.transform”中的处理函数返回js对象。 “csv.stringify”将在提供列选项时接受对象。

答案 2 :(得分:1)

好方法(也是内存友好)是使用流。首先,您执行MongoDB请求:

collection.find({ some: "thing" }, function (err, cursor) {
    if (err) { return ...; }
    function next () {
      cursor.nextObject(function (err, obj) {
         if (err) { return ...; }
         if (obj === null) {
              return outputStream.end();
         }
         outputStream.write(stringify(obj));
         next();
      });
    }
    next();
});

... outputStream可以是HTTP响应流(假设您在http服务器请求 - 响应中)或任何其他可写流。

这或多或少只是基本的例子 - 可能它可以改进,但这是我的推荐方法:逐个字符串化对象并将它们写在流中。