我有一个项目要求。我正在获取以下文本格式的数据。
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数据。
答案 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);
但是这很容易出错-格式稍有变化就会立即中断。我会回应别人在评论中说的话-获得更好的数据格式,减少歧义。