首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否将CSV文件转换为JSON字典?

是否将CSV文件转换为JSON字典?
EN

Stack Overflow用户
提问于 2015-10-29 05:01:03
回答 5查看 5K关注 0票数 1

我需要将一个大型CSV数据集转换为JSON,但是输出应该是如下所示的JSON字典:

代码语言:javascript
复制
var products = {
    "crystal": {
        "description": "This is a crystal",
        "price": "2.95"
    },
    "emerald": {
        "description": "This is a emerald",
        "price": "5.95"
    }
};

这是CSV表的样子:

我正在使用一个引用here的脚本来生成JSON:

代码语言:javascript
复制
var csv = require('csv')
var fs = require('fs')
var f = fs.createReadStream('Fielding.csv')
var w = fs.createWriteStream('out.txt')

w.write('[');

csv()
.from.stream(f, {columns:true})
.transform(function(row, index) {
    return (index === 0 ? '' : ',\n') + JSON.stringify(row);
})
.to.stream(w, {columns: true, end: false})
.on('end', function() {
     w.write(']');
     w.end();
 });

但是,该脚本的输出是以以下格式创建的:

代码语言:javascript
复制
[
    {
        "name": "crystal",
        "description": "This is a crystal",
        "price": "2.95"
    },
    {
        "name": "emerald",
        "description": "This is a emerald",
        "price": "5.95"
    }
]

我如何修改脚本以获得我想要的“字典”格式?

EN

回答 5

Stack Overflow用户

发布于 2015-10-29 05:20:05

您所需要做的就是循环遍历数组,并使用item.name作为字典对象的键

代码语言:javascript
复制
var products ={};

data.forEach(function(item){
     products[item.name] = item;
});

这会将name属性保留在项中,但这应该不是问题

票数 2
EN

Stack Overflow用户

发布于 2017-02-16 02:32:07

我发现csv parser库最有用:

代码语言:javascript
复制
var csvText=`status,path,name,ext,checksum,size,document_service_id,document_service_path,message
success,./15-02-2017_17-11/d77c7886-ffe9-40f2-b2fe-e68410d07891//expE1.txt,expE1.txt,txt,38441337865069eabae7754b29bb43e1,414984,8269f7e3-3221-49bb-bb5a-5796cf208fd1,/neuroinftest/20170215/expE1.txt,
success,./15-02-2017_17-11/d77c7886-ffe9-40f2-b2fe-e68410d07891//expE10.txt,expE10.txt,txt,f27e46979035706eb0aaf58c26e09585,368573,2c94ed19-29c9-4660-83cf-c2148c3d6f61,/neuroinftest/20170215/expE10.txt,
success,./15-02-2017_17-11/d77c7886-ffe9-40f2-b2fe-e68410d07891//expE2.txt,expE2.txt,txt,e1040d9546423c823944120de0e5c46c,333308,b3898f5d-1058-4cf3-acf9-76759117b810,/neuroinftest/20170215/expE2.txt,
`
var csv = require('csv');
csv.parse(csvText, {columns: true}, function(err, data){
    console.log(JSON.stringify(data, null, 2));
});

在变量csvText中,我有一个逗号分隔的文件,第一行作为头文件。我使用parse函数,并传递{columns: true}以指示第一行包含标题。回调函数(data)中的第二个参数有一个对象,其键是标头,值是相应的csv单元格。我使用JSON.stringify将其很好地打印出来,结果对象如下所示(它将其放入一个数组):

代码语言:javascript
复制
[
  {
    "status": "success",
    "path": "./15-02-2017_17-11/d77c7886-ffe9-40f2-b2fe-e68410d07891//expE1.txt",
    "name": "expE1.txt",
    "ext": "txt",
    "checksum": "38441337865069eabae7754b29bb43e1",
    "size": "414984",
    "document_service_id": "8269f7e3-3221-49bb-bb5a-5796cf208fd1",
    "document_service_path": "/neuroinftest/20170215/expE1.txt",
    "message": ""
  },
  {
    "status": "success",
    "path": "./15-02-2017_17-11/d77c7886-ffe9-40f2-b2fe-e68410d07891//expE10.txt",
    "name": "expE10.txt",
    "ext": "txt",
    "checksum": "f27e46979035706eb0aaf58c26e09585",
    "size": "368573",
    "document_service_id": "2c94ed19-29c9-4660-83cf-c2148c3d6f61",
    "document_service_path": "/neuroinftest/20170215/expE10.txt",
    "message": ""
  },
  {
    "status": "success",
    "path": "./15-02-2017_17-11/d77c7886-ffe9-40f2-b2fe-e68410d07891//expE2.txt",
    "name": "expE2.txt",
    "ext": "txt",
    "checksum": "e1040d9546423c823944120de0e5c46c",
    "size": "333308",
    "document_service_id": "b3898f5d-1058-4cf3-acf9-76759117b810",
    "document_service_path": "/neuroinftest/20170215/expE2.txt",
    "message": ""
  }
]

更新:使用reduce可以很容易地将此数组转换为您需要的对象:

代码语言:javascript
复制
var res_obj = data.reduce(function(acc, cur, i) {
  acc[cur.name] = cur;
  return acc;
}, {});

在我的例子中,我使用name属性作为键。确保它是唯一的。

票数 2
EN

Stack Overflow用户

发布于 2015-10-29 05:18:21

我认为像这样的东西会起作用:

代码语言:javascript
复制
var products_arr = [{"name":"crystal","description":"This is a crystal","price":"2.95"},
 {"name":"emerald","description":"This is a emerald","price":"5.95"}]
var products = {};

for (var i = 0, l = products_arr.length ; i < l ; ++i) {
    var x = products_arr[i];
    var name = x.name
    delete x.name; // deletes name property from JSON object
    products[name] = x;
}

这将输出:

代码语言:javascript
复制
{
  "crystal": {
    "description": "This is a crystal",
    "price": "2.95"
  },
  "emerald": {
    "description": "This is a emerald",
    "price": "5.95"
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33401523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档