将CSV字符串解析为2维对象

3

我目前正在尝试将csv字符串解析为一个对象,该对象允许我在第一个对象中找到客户名称,然后能够访问基于该名称的子数组中的客户信息。

csvString = "roll R coaster,0124454,20.21\n

我知道.split()函数将根据分隔符拆分字符串并将其放入数组中。如果我使用"\n"作为第一个分隔符,则会为每个客户创建5个数组元素,然后是他们各自的信息。
array[0] = "roll R coaster,0124454,20.21"

你可以利用 Array.map 函数,并使用 split 解析每行数据。 - E. Sundin
3个回答

1

我认为这段代码基本上可以满足你的需求。

csvString = "roll R coaster,0124454,20.21\n  Sammy Smocks,000006,(20.20)\n maxwell BLANCO  ,002125,(15),\n Will   Monsters,003576,6.9,15\n Trank   Burger,103529,9.56,5";


const objects = csvString.split('\n ')
  .map(x => {
    const [name, TransactionNumber, TrAm] = x.split(',');
    TransactionAmount = TrAm[0] === '(' ? +TrAm.slice(1, -1) : +TrAm;
    
    FullName = name
     .replace(/^\s{2,}/g, ' ')
      .replace(/\s{3}/g, '  ')
      .replace(/\s{2}$/g, ' ');
            
    const [FirstName, MiddleName, LastName] = FullName.split(' ');
    
    return {
      FirstName, 
      MiddleName, 
      LastName, 
      TransactionNumber,
      TransactionAmount
    }
  });

console.log(objects);


0

所以我们将csv作为字符串输入,按'\n'分割每一行。然后使用正则表达式拆分行,您建议根据所需的对象属性,这是可预测的每行输入,因此我们将其放入json对象中并返回它。然后您可以通过myData[i]).firstName访问它。通过微小的更改,如果您想要的话,您可以为每一行赋予一个标识,例如交易编号,因此myData["000006"].lastName将返回'Smocks'。

let csvString = "roll R coaster,0124454,20.21\n  Sammy Smocks,000006,(20.20)\n maxwell BLANCO  ,002125,(15),\n Will Monsters,003576,6.9,15\n Trank   Burger,103529,9.56,5";  
let myData = [];

csvString.split('\n').forEach((row) => {
  let rowData = row.match(/(\w+) *(\w*) *(\w*),(.+),(.+)/i);
  myData.push({
    firstname: rowData[1],
    middleName: rowData[3] ? rowData[2] : "",
    lastName: rowData[3] ? rowData[3] : rowData[2],
    transactionNumber: rowData[4],
    transactionAmount: rowData[5]
  });
});
console.log(myData);

输出:

(5) [{…}, {…}, {…}, {…}, {…}]
  0:{firstname: "roll", middleName: "R", lastName: "coaster", transactionNumber: "0124454", transactionAmount: "20.21"}
  1:{firstname: "Sammy", middleName: "", lastName: "Smocks", transactionNumber: "000006", transactionAmount: "(20.20)"}
  2:{firstname: "maxwell", middleName: "", lastName: "BLANCO", transactionNumber: "002125", transactionAmount: "(15),"}
  3:{firstname: "Will", middleName: "", lastName: "Monsters", transactionNumber: "003576,6.9", transactionAmount: "15"}
  4:{firstname: "Trank", middleName: "", lastName: "Burger", transactionNumber: "103529,9.56", transactionAmount: "5"}

0
为了达到预期的效果,您可以使用以下选项,使用数组map()方法两次 - 一次用于FirstName、MiddleName、LastName,另一次用于剩余的逗号分隔值 - TransactionNumber、TransactionAmount。
  var csv = "roll R coaster,0124454,20.21".split(",");
  var keys = [["FirstName", "MiddleName", "LastName"], "TransactionNumber","TransactionAmount"]
  var Obj ={}

  csv.map((val, i)=>{
    if(i == 0){
      val.split(" ").map((v,idx)=>{
          Obj[keys[0][idx]] = v.toUpperCase()
      }) 
    }else{
      Obj[keys[i]] = val
    }

  })
  console.log(Obj)

https://codepen.io/nagasai/pen/aqaGQN?editors=1010


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