在 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
) 的文档特别声明它可以与流一起使用(请参阅fromStream
、toStream
)。所以使用标准输出并不是硬编码的。
当您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的主要内容,如果未能解决你的问题,请参考以下文章
javascript [base64 string to image file]如何在node.js#Node.js中写入图像