将CSV文件转换为JSON词典吗? [英] Convert CSV file to JSON dictionary?

查看:111
本文介绍了将CSV文件转换为JSON词典吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要将大型CSV数据集转换为JSON,但是输出应该是这样的JSON字典:

I need to convert a large CSV data set to JSON, however the output should be a JSON dictionary like this:

var products = {
    "crystal": {
        "description": "This is a crystal",
        "price": "2.95"
    },
    "emerald": {
        "description": "This is a emerald",
        "price": "5.95"
    }
};

这是CSV表的样子:

This is what the CSV table would look like:

我正在使用引用此处的脚本来生成JSON:

I am using a script referenced here to generate the JSON:

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();
 });

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

However the output from that script is created in this format:

[
    {
        "name": "crystal",
        "description": "This is a crystal",
        "price": "2.95"
    },
    {
        "name": "emerald",
        "description": "This is a emerald",
        "price": "5.95"
    }
]

我将如何修改脚本以获取所需的字典"格式?

How would I modify the script to get my desired "dictionary" format?

推荐答案

我发现 csv解析器最有用的库:

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很好地打印它,结果对象看起来像这样(将它放入数组中):

In variable csvText I have my comma-separated file, with the first line serving as a header. I use the parse function and I'm passing the {columns: true} to indicated that the first line has the headers. Second parameter in the callback function (data) has the object with keys being the headers and the values being the corresponding csv cells. I use JSON.stringify to print it nicely and the result object looks like this (it puts it into an array):

[
  {
    "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": ""
  }
]

UPD :使用reduce:

var res_obj = data.reduce(function(acc, cur, i) {
  acc[cur.name] = cur;
  return acc;
}, {});

就我而言,我使用name属性作为键.确保它是唯一的.

In my case I use the name property as a key. Make sure it's unique.

这篇关于将CSV文件转换为JSON词典吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆