如何将分隔的文本转换为JSON

问题描述 投票:0回答:3

分隔文本文件(文件名是数据)=>

01 - Rental Details Rental ID,01 - Rental Details Local Start Time,01 - Rental Details Local End Time,01 - Rental Details Bike ID,01 - Rental Details Duration In Seconds Uncapped,03 - Rental Start Station ID,03 - Rental Start Station Name,02 - Rental End Station ID,02 - Rental End Station Name,User Type,Member Gender,05 - Member Details Member Birthday Year
22178529,2019-04-01 00:02:22,2019-04-01 00:09:48,6251,446.0,81,Daley Center Plaza,56,Desplaines St & Kinzie St,,Male,1975
22178530,2019-04-01 00:03:02,2019-04-01 00:20:30,6226,"1,048.0",317,Wood St & Taylor St,59,Wabash Ave & Roosevelt Rd,Subscriber,Female,1984

已转换的JSON文件(文件名是data.JSON)

{
    "01 - Rental Details Rental ID": "22178529",
    "01 - Rental Details Local Start Time": "2019-04-01 00:02:22",
    "01 - Rental Details Local End Time": "2019-04-01 00:09:48",
    "01 - Rental Details Bike ID": "6251",
    "01 - Rental Details Duration In Seconds Uncapped": "446.0",
    "03 - Rental Start Station ID": "81",
    "03 - Rental Start Station Name": "Daley Center Plaza",
    "02 - Rental End Station ID": "56",
    "02 - Rental End Station Name": "Desplaines St & Kinzie St",
    "User Type": "Subscriber",
    "Member Gender": "Male",
    "05 - Member Details Member Birthday Year": "1975",
},
{
    "01 - Rental Details Rental ID": "22178529",
    "01 - Rental Details Local Start Time": "2019-04-01 00:02:22",
    "01 - Rental Details Local End Time": "2019-04-01 00:09:48",
    "01 - Rental Details Bike ID": "6251",
    "01 - Rental Details Duration In Seconds Uncapped": "446.0",
    "03 - Rental Start Station ID": "81",
    "03 - Rental Start Station Name": "Daley Center Plaza",
    "02 - Rental End Station ID": "56",
    "02 - Rental End Station Name": "Desplaines St & Kinzie St",
    "User Type": "Subscriber",
    "Member Gender": "Male",
    "05 - Member Details Member Birthday Year": "1975",
}

javascript json
3个回答
1
投票

如果是简单的CSV格式,可能会有所帮助:

function convert(csv) {
  const result = {};
  const lines = csv.split('\n').map(line => line.split(','));

  for (let i = 0; i < lines[0].length; i++) {
    result[lines[0][i]] = lines[1][i];
  }
  return result;
}

PS。假设有精确的2行(标题和值),则每行内的值以逗号分隔。


0
投票

提供的输入似乎与提供的输出不匹配。但是我认为这是您所需要的。

function convert(text){
    const lines = text.split('\n');
    const keys = lines.shift().split(',');

    const results = [];

    for (const line of lines) {
      const values = line.match(/".*"|[^,"]+/g);
      const result = {};
      for (let i = 0; i < keys.length; i++) {
        result[keys[i]] = values[i];
      }
      results.push(result);
    }

    return results;
}

0
投票

在换行符上分割行匹配带引号的字符串,普通字符串,逗号或无字符串(空白)将标题的第一行拼接为键

将行映射到对象图

text = `01 - Rental Details Rental ID,01 - Rental Details Local Start Time,01 - Rental Details Local End Time,01 - Rental Details Bike ID,01 - Rental Details Duration In Seconds Uncapped,03 - Rental Start Station ID,03 - Rental Start Station Name,02 - Rental End Station ID,02 - Rental End Station Name,User Type,Member Gender,05 - Member Details Member Birthday Year
22178529,2019-04-01 00:02:22,2019-04-01 00:09:48,6251,446.0,81,Daley Center Plaza,56,Desplaines St & Kinzie St,,Male,1975
22178530,2019-04-01 00:03:02,2019-04-01 00:20:30,6226,"1,048.0",317,Wood St & Taylor St,59,Wabash Ave & Roosevelt Rd,Subscriber,Female,1984`


const rows = text.split(/\r?\n/g)
  .map(x => 
    [...x.matchAll(/(?:"([^"]+?)"|([^,]+?)|(,))(?=,|$)/g)]
      .map(([,quoted,x,])=>quoted||x||'')) //extract string or blank
const keys = rows.shift() //extract first row of keys

console.log(
rows.map(row=>Object.fromEntries(
  row.map((v,i)=>[keys[i],v])
))
)
© www.soinside.com 2019 - 2024. All rights reserved.