在 Node.js 中写入 CSV

Posted

技术标签:

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

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

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

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

【问题讨论】:

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

【讨论】:

以上是关于在 Node.js 中写入 CSV的主要内容,如果未能解决你的问题,请参考以下文章

在 Node.js 中写入文件时创建目录

javascript [base64 string to image file]如何在node.js#Node.js中写入图像

node.js怎么往文本文档中写入数据

Node.js Http 结束后写入

在 Node.js 中如何停止脚本执行,成功向控制台写入错误消息,然后退出脚本?

使用 Node.js 将一行写入 .txt 文件