使用node-csvtojson时如何将数据作为json数组输出?
const request = require("request");
const csv = require("csvtojson");
const fs = require("fs");
const readStream = request.get("http://www.example.com/some.csv");
const writeStream = fs.createWriteStream("./some.json");
const converter = csv({
includeColumns: /Column3|Column2/
});
readStream.pipe(converter).pipe(writeStream);
假定以下数据结构:
Column1,Column2,Column3
1,2,3
one,two,three
我希望输出文件包含:
[
{ "Column2": "2", "Column3": "3" },
{ "Column2": "two", "Column3": "three" }
]
我实际上得到以下信息:
{ "Column2": "2", "Column3": "3" }
{ "Column2": "two", "Column3": "three" }
如何确保获得JSON数组作为输出?
我知道this issue,但是我发现toArrayString
已从api中删除。
答案 0 :(得分:1)
对此只是一个较晚的回应。
在2.0.10
版中,JSON数组格式又回来了。
只需将downstreamFormat
设置为json
csv({downstreamFormat:"json"}).fromFile(fileName).pipe(fileWritableStream);
可以找到详细信息here
答案 1 :(得分:0)
您得到的输出似乎不是有效的csv。无论如何,这是一个可以在node中运行的小功能,可以将输出转换为数组。
const arrayConvert = filePath => {
const fs = require("fs");
const fileString = fs.readFileSync(filePath).toString();
return JSON.parse("[" + fileString.replace(/\n/g, ",") + "]");
};
console.log(arrayConvert("./data.csv")[0].Column2);
您可以使用JSON.stringify()保存它。希望对您有所帮助。
答案 2 :(得分:0)
在询问时,我无法使用csvtojson
api做我想做的事情。
万一有人感兴趣,我最终的解决方案是使用through2-map
和through2-reduce
创建一个数组。
...
const map = require("through2-map");
const reduce = require("through2-reduce");
...
readStream
.pipe(converter)
.pipe(reduce((previous, current) => {
return previous ? `${previous},${current}` : current;
})
.pipe(map(chunk => `[${chunk}]`))
.pipe(writeStream);