将文本内容解析为特定的json格式

时间:2019-06-11 12:21:21

标签: javascript json

我有一个项目要求。我正在获取以下文本格式的数据。

SL NO  POLICY NO  AMOUNT  NAME            CGST TAX
02     33051090   195.0   D BL ESSENTIAL  9.00%
03     33051091   195.1   D HRFL COD      9.00%

但是我需要处理文本内容并从中形成json。

[{
"SL NO":"02",
"POLICY NO":"33051090",
"AMOUNT":"195.0",
"NAME":"D BL ESSENTIAL",
"CGST TAX":"9.00%"
},
{
"SL NO":"03",
"POLICY NO":"33051091",
"AMOUNT":"195.1",
"NAME":"D HRFL COD",
"CGST TAX":"9.00%"
}]

我无法想到任何逻辑来区分值并映射到json属性,因为它们之间有很多空白。

我得到的内容之间没有唯一的分隔符。所以它不像CSV数据。

2 个答案:

答案 0 :(得分:2)

由于除名称外的所有字段均为数字,因此可以将它们与正则表达式匹配。名称是金额和税率之间的所有内容。

let re = /^(\d+)\s+(\d+)\s+([\d.]+)\s+(.*?)\s+([\d.]+%)$/;
let data = `SL NO POLICY NO AMOUNT NAME CGST TAX
02   33051090  195.0  D BL ESSENTIAL 9.00%
03  33051091  195.1    D HRFL COD  9.00%`;
let obj = [];
data.split('\n').forEach(line => {
  let match = line.match(re);
  if (match) {
    obj.push({
      "SL NO": match[1],
      "POLICY NO": match[2],
      "AMOUNT": match[3],
      "NAME": match[4],
      "CGST TAX": match[5]
    });
  }
});
console.log(obj);

或者,您可以希望它们都不包含任何嵌入的空格,而不是依赖于其他字段为数字。

let re = /^(\S+)\s+(\S+)\s+(\S+)\s+(.*?)\s+(\S+)$/;
let data = `SL NO POLICY NO AMOUNT NAME CGST TAX
02   33051090  195.0  D BL ESSENTIAL 9.00%
03  33051091  195.1    D HRFL COD  9.00%`;
let obj = [];
data.split('\n').slice(1).forEach(line => {
  let match = line.match(re);
  if (match) {
    obj.push({
      "SL NO": match[1],
      "POLICY NO": match[2],
      "AMOUNT": match[3],
      "NAME": match[4],
      "CGST TAX": match[5]
    });
  }
});
console.log(obj);

.slice(1)是跳过标题行。

答案 1 :(得分:0)

您可以使用正则表达式来解决此问题,例如(\d+)\s+(\d+)\s+([\d\.]+)\s+([\w\s]+)\s+([\d\.]+\%)

var re = /^(\d+)\s+(\d+)\s+([\d\.]+)\s+([\w\s]+)\s+([\d\.]+\%)$/;
var data = `SL NO POLICY NO AMOUNT NAME CGST TAX
02   33051090  195.0  D BL ESSENTIAL 9.00%
03  33051091  195.1    D HRFL COD  9.00%`;
var result = data.split("\n").slice(1).map(item => {
    var match = item.match(re);
    return {
       "SL NO": match[1],
       "POLICY NO": match[2],
       "AMOUNT": match[3],
       "NAME": match[4],
       "CGST TAX": match[5]
    };
});
console.log(result);

但是这很容易出错-格式稍有变化就会立即中断。我会回应别人在评论中说的话-获得更好的数据格式,减少歧义。