如何使用node-csvtojson创建JSON数组?

时间:2019-01-07 23:26:47

标签: node.js json csv node-streams

使用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中删除。

3 个答案:

答案 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-mapthrough2-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);