首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当节点js中的一列有两个值时,如何将csv转换为JSON

当节点js中的一列有两个值时,如何将csv转换为JSON
EN

Stack Overflow用户
提问于 2019-11-18 10:10:08
回答 2查看 1.3K关注 0票数 0

我有一个csv文件,其中一行有时一列有两个值。目前,我正在尝试使用,进行拆分,但并没有像预期的那样工作。有没有人能解释一下如何达到预期的输出。我不想使用任何npm库。

代码语言:javascript
运行
复制
//users.csv
name,age,hobbies
james,20,"reading,playing"
marie,18,singing
peter,19,watching movies

//index.js
const fs = require('fs');
const {promisify} = require("util");
const readFile = promisify(fs.readFile)
const readSheet = async () =>{
    const result = await readFile("./users.csv", "utf-8");
    const csv = result.split("\n").map(ele=>ele.split(","))
    let keys = csv.slice(0,1)[0];
    const values  = csv.slice(1)
    keys.map(keys=>keys.split(''))
    let usersArr = [];
    for(let i = 0;i<values.length;i++){
        let usersObj = {};
        keys.forEach((key,j)=>usersObj[key] = values[i][j])
        usersArr.push(usersObj)
    }
    return usersArr


}
//current output
[ { name: 'james', age: '20', hobbies: '"reading' },
  { name: 'marie', age: '18', hobbies: 'singing' },
  { name: 'peter', age: '19', hobbies: 'watching movies' } ]
  //expected output object
[
 {
   "name": "james",
   "age": 20,
   "hobbies": ["reading","playing"]
 },
 {
   "name": "marie",
   "age": 18,
   "hobbies": ["singing"]
 },
 {
   "name": "peter",
   "age": 19,
   "hobbies": ["watching movies"]
 }
]
EN

回答 2

Stack Overflow用户

发布于 2019-11-18 10:55:39

您可以使用本文中描述的csv函数:https://www.bennadel.com/blog/1504-ask-ben-parsing-csv-strings-with-javascript-exec-regular-expression-command.htm

然后将数组转换为对象:

代码语言:javascript
运行
复制
let csv = ... // csv data
for(let i=1;i<csv.length;i++){
    let obj = {};
    for(let b in csv[i]){
        obj[csv[0][b]] = csv[i][b];
    }
    csv[i] = obj;
}
csv.shift(); // remove the first row (headers)

之后,只需用逗号拆分数组中的hobbies列:

代码语言:javascript
运行
复制
for(let entry of csv){
    csv.hobbies = csv.hobbies.split(','); 
}
票数 -1
EN

Stack Overflow用户

发布于 2019-11-18 11:06:31

用逗号分隔每一行是不起作用的,因为引号用逗号括起来。您的最佳选择是使用来自npm的库,例如fast-csv。由于您不想使用库,因此可以使用正则表达式来拆分行,如this question中所述:

下面是一个示例工作代码(但请注意其中的限制):

代码语言:javascript
运行
复制
const fs = require('fs');
const {promisify} = require("util");
const readFile = promisify(fs.readFile)

const CSV_CONTENT = "name,age,hobbies\njames,20,\"reading,playing\"\nmarie,18,singing\npeter,19,watching movies\n";

const readSheet = async () => {
    //const lines = await readFile("./users.csv", "utf-8");

    const lines = CSV_CONTENT.split("\n")
                              .filter(l => !!l) // filter empty lines

    let keys = lines.slice(0,1)[0].split(',') // assuming there's no quotes in keys
    const valueLines  = lines.slice(1)

    let usersArr = [];
    for(let i=0; i<valueLines.length; i++) {
        let usersObj = {};
        let values = splitLine(valueLines[i]); // splitLine handles quotes
        keys.forEach((key,j) => usersObj[key] = trimQuotes(values[j]))
        usersArr.push(usersObj)
    }
    return usersArr

}

function splitLine(line) {
        var matches = line.match(/(\s*"[^"]+"\s*|\s*[^,]+|,)(?=,|$)/g);
        for (var n = 0; n < matches.length; ++n) {
            matches[n] = matches[n].trim();
            if (matches[n] == ',') matches[n] = '';
        }
        if (line[0] == ',') matches.unshift("");
        return matches;
}

function trimQuotes(input) {
  let expr = /^(")?(.*?)(")?$/g
  let groups = expr.exec(input)
  return groups[2]
}

(async () => {
  let result = await readSheet();
  console.log(result);
})();
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58907126

复制
相关文章

相似问题

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