NodeJS - 将CSV转换为JSON对象数组

3

我正在尝试将以下CSV格式的数据转换为JSON对象数组:

CSV formatted data: apples,oranges,grapes,peach,pineapple

JSON Object Array: {
                     fruits: [
                       {
                          "name": "apples"
                       },
                       {
                          "name": "oranges"
                       },
                       {
                          "name": "grapes"
                       },
                       {
                          "name": "peach"
                       },
                       {
                          "name": "pineapple"
                       }
                     ]
                   }

我参考了这个npm包 https://www.npmjs.com/package/csvtojson 和这个带流解析器的 https://github.com/nicolashery/example-stream-parser,但不确定它们是否符合我的需求。
请问有什么方法可以将CSV数据转换为JSON对象数组并按照所发布的格式呈现?
以上问题的解决方案(请参考下面的评论部分以获取更多详细信息)。
var res = {};

res.fruits = 'apples|1,oranges|2,grapes|3,peach|4,pineapple|5'
.split(',').map(function (fruit) { //as did by @Dmitriy Simushev in the below reply
    return {
      "name": fruit.split('|')[0],
      "value": fruit.split('|')[1]
    }
});

document.write('<pre>' + JSON.stringify(res, 0, 2) + '</pre>');

1
你展示的格式不是csv格式。在csv中,逗号用于分隔字段/属性,每行表示一条记录/对象。 - Pero P.
5个回答

1

您可以轻松地将 String.prototype.splitArray.prototype.map 结合使用,以实现目标。

以下是如何完成的示例:

var data = "apples,oranges,grapes,peach,pineapple";

// Wrap fruits names with object,
var fruits = data.split(',').map(function(fruit) {
    return {name: fruit}
});

// Wrap fruits set with outer object.
var json = {fruits: fruits};

// Show the result.
console.dir(json);

投影的数据(“苹果,橘子,葡萄,桃子,菠萝”)只是一个示例,在应用程序中,我将获得大约1100个逗号分隔的值...您认为即使在那种情况下,拆分和映射方法也能够正常工作,而不会影响内存吗? - Sai
实际上,生成的JSON将存储_您的所有数据_。因此,无论如何您都会使用这个内存。此外,1100个值是一个相对较小的数据包。 - Dmitriy Simushev

1

var csv_data = 'apples,oranges,grapes,peach,pineapple';
var csv_array = csv_data.split(',');
var object = {};
var arr = [];
for(var i=0; i<csv_array.length; i++){
    arr.push({name:csv_array[i]});
}
object['fruits'] = arr;
console.log(object);


1
你可以使用纯JavaScript,使用splitmap函数。

var res = {};

res.fruits = 'apples|1,oranges|2,grapes|3,peach|4,pineapple|5'
    .split(',').map(e => ({
        "name": e.split('|')[0],
        "value": e.split('|')[1]
    }));

document.write('<pre>' + JSON.stringify(res, 0, 2) + '</pre>');


使用普通的split和map函数非常好,特别是在使用ECMA语法(不太确定它被称为箭头函数吗?)时,所以正如我所说,这非常简洁和清晰...只是想知道如果我有CSV数据,例如'apples | 1,oranges | 2,grapes | 3,peach | 4,pineapple | 5',那么生成的JSON应该看起来像这样: - Sai
{ "fruits": [ { "name": "苹果", "value": "1" }, { "name": "橙子", "value": "2" }, { "name": "葡萄", "value": "3" }.... ] } - Sai
很棒,那会起作用,根据 http://caniuse.com/#search=%3D%3E,似乎我们对箭头函数的支持有限,在 IE 上不用担心,但在 Safari、IOS Safari 和 Android 上似乎没有支持...只是想看看是否可以使用传统的 map 函数来实现这个,因此我相信支持范围会比较广...你怎么看? - Sai
@Sai 是的,这取决于您的需求。如果您想支持旧浏览器,您应该使用普通函数而不是箭头函数,或者使用像babel.js这样的转译器。 - isvforall
是的,我也在寻找移动浏览器方面的支持,我喜欢babel.js的想法,看起来他们有npm支持...所以现在我只是修改了split和map函数,使其在所有浏览器中都能工作(https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Browser_compatibility)。 - Sai
我会修改我的原始帖子并附上解决方案,以便帮助其他人。非常感谢@isvforall的时间和迅速回复。 - Sai

0

文档所示,您可以像这样转换您的CSV文件

var Converter = require("csvtojson").Converter;
var converter = new Converter({});
converter.fromFile("./yourCSVfile.csv", function(err, result){
   // do something with "result", it's json
});

0

到目前为止,每个答案都没有反映出您的数据存储在文件中。我认为这就是您要寻找的。您可以使用简单的Node.js流来实现:

var fs = require('fs');
var es = require('event-stream');

fs.createReadStream('data.csv')
.pipe(es.split())
.on('data', (row) => {
  console.log({
    fruits: row.toString().split(',').map((fruit) => {
      return {
        name: fruit.trim()
      }
    })
  });
});

您需要安装 event-stream npm install event-stream


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接