我正在努力寻找一种在 Node.js 中将数据写入 CSV的方法。
有几个 CSV 插件可用,但它们只“写入”到标准输出。
理想情况下,我想使用循环逐行编写。
我正在努力寻找一种在 Node.js 中将数据写入 CSV的方法。
有几个 CSV 插件可用,但它们只“写入”到标准输出。
理想情况下,我想使用循环逐行编写。
您可以使用 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!');
}
});
node-csv-parser
( )的文档npm install csv
特别声明它可以与流一起使用(参见fromStream
, toStream
)。所以使用标准输出并不是硬编码的。
其他几个 CSV 解析器也会在您出现时出现npm search csv
——您可能也想查看它们。
这是一个使用csv-stringify将适合内存的数据集写入 csv 文件的简单示例fs.writeFile
。
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.');
});
});
如果你想像你说的那样使用循环,你可以用 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)
})
如果您不想使用除 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')
对于那些喜欢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.'));
**如果您不想使用除 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)
}
});
}