【问题标题】:Write to a CSV in Node.js在 Node.js 中写入 CSV
【发布时间】:2012-04-30 21:50:54
【问题描述】:

我正在努力寻找一种在 Node.js 中将数据写入 CSV 的方法。

有几个 CSV 插件可用,但它们只能“写入”到标准输出。

理想情况下,我想使用循环逐行编写。

【问题讨论】:

  • “然而他们只‘写’到标准输出”这似乎真的令人惊讶。他们不会写信给任何可写的Stream,它必须stdout?!
  • 您能否包含指向您测试过的模块的链接,以便其他人可以查看它们和/或知道建议哪些替代方案?
  • 有一个使用 nodejs 生成 CSV 的教程。 programmerblog.net/generate-csv-using-nodejs

标签: javascript node.js csv


【解决方案1】:

你可以使用 fs (https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback):

var dataToWrite;
var fs = require('fs');

fs.writeFile('form-tracking/formList.csv', dataToWrite, 'utf8', function (err) {
  if (err) {
    console.log('Some error occured - file either not saved or corrupted file saved.');
  } else{
    console.log('It\'s saved!');
  }
});

【讨论】:

    【解决方案2】:

    node-csv-parser (npm install csv) 的文档特别声明它可以与流一起使用(请参阅fromStreamtoStream)。所以使用标准输出并不是硬编码的。

    当您npm search csv 时,还会出现其他几个 CSV 解析器——您可能也想看看它们。

    【讨论】:

      【解决方案3】:

      这是一个使用csv-stringify 将适合内存的数据集写入使用fs.writeFile 的csv 文件的简单示例。

      import stringify from 'csv-stringify';
      import fs from 'fs';
      
      let data = [];
      let columns = {
        id: 'id',
        name: 'Name'
      };
      
      for (var i = 0; i < 10; i++) {
        data.push([i, 'Name ' + i]);
      }
      
      stringify(data, { header: true, columns: columns }, (err, output) => {
        if (err) throw err;
        fs.writeFile('my.csv', output, (err) => {
          if (err) throw err;
          console.log('my.csv saved.');
        });
      });
      

      【讨论】:

      • 与约翰的解决方案相比,这里有什么优势?确定写的是string
      【解决方案4】:

      如果你想使用你所说的循环,你可以用 Node fs 做这样的事情:

      let fs = require("fs")
      
      let writeStream = fs.createWriteStream('/path/filename.csv')
      
      someArrayOfObjects.forEach((someObject, index) => {     
          let newLine = []
          newLine.push(someObject.stringPropertyOne)
          newLine.push(someObject.stringPropertyTwo)
          ....
      
          writeStream.write(newLine.join(',')+ '\n', () => {
              // a line was written to stream
          })
      })
      
      writeStream.end()
      
      writeStream.on('finish', () => {
          console.log('finish write stream, moving along')
      }).on('error', (err) => {
          console.log(err)
      })
      

      【讨论】:

        【解决方案5】:

        如果您不想使用除 fs 之外的任何库,您可以手动进行。

        let fileString = ""
        let separator = ","
        let fileType = "csv"
        let file = `fileExample.${fileType}`
        
        Object.keys(jsonObject[0]).forEach(value=>fileString += `${value}${separator}`)
            fileString = fileString.slice(0, -1)
            fileString += "\n"
        
            jsonObject.forEach(transaction=>{
                Object.values(transaction).forEach(value=>fileString += `${value}${separator}`)
                fileString = fileString.slice(0, -1)
                fileString += "\n"
            })
        
        fs.writeFileSync(file, fileString, 'utf8')
        

        【讨论】:

          【解决方案6】:

          对于那些喜欢fast-csv的人:

          const { writeToPath } = require('@fast-csv/format');
          
          const path = `${__dirname}/people.csv`;
          const data = [{ name: 'Stevie', id: 10 }, { name: 'Ray', id: 20 }];
          const options = { headers: true, quoteColumns: true };
          
          writeToPath(path, data, options)
                  .on('error', err => console.error(err))
                  .on('finish', () => console.log('Done writing.'));
          

          【讨论】:

            【解决方案7】:

            **如果您不想使用除 fs 之外的任何库,您可以手动进行。此外,您可以过滤要写入 CSV 文件的数据 **

            router.get('/apiname', (req, res) => {
             const data = arrayOfObject; // you will get from somewhere
             /*
                // Modify old data (New Key Names)
                let modifiedData = data.map(({ oldKey1: newKey1, oldKey2: newKey2, ...rest }) => ({ newKey1, newKey2, ...rest }));
             */
             const path = './test'
             writeToFile(path, data, (result) => {
                 // get the result from callback and process
                 console.log(result) // success or error
               });
            });
            
            writeToFile = (path, data, callback) => {
                fs.writeFile(path, JSON.stringify(data, null, 2), (err) => { // JSON.stringify(data, null, 2) help you to write the data line by line
                        if (!err) {
                            callback('success');
                            // successfull
                        }
                        else {
                             callback('error');
                           // some error (catch this error)
                        }
                    });
            }
            

            【讨论】:

              猜你喜欢
              • 2019-03-05
              • 2016-05-13
              • 2021-12-10
              • 1970-01-01
              • 2014-04-01
              • 2017-12-03
              • 2015-11-30
              • 2016-09-30
              • 2013-08-06
              相关资源
              最近更新 更多