从文本文件创建结构化JSON时遇到一些困难。这是一个文本文件的例子
BlocA
value 1 param X
value 2 param Y
value 3 param Z
BlocB
this is a line
this is another line
BlocC foo
1
2
3
BlocC bar
something else
我想要的JSON是这样的:
{
"BlocA" : [
"value 1 param X",
"value 2 param Y",
"value 3 param Z"
]
},
"BlocB" : [
"this is a line",
"this is another line"
]
},
"BlocC" : [
{"foo" : [1,2,3]},
{"bar" : ["something else"]}
]
}
在我的文本文件中,bloc始终从一行的第一个字符开始,一个bloc的属性低于下,并且始终至少以空格字符开头。
有时,集团名称后跟一个字符串(如" BlocC foo"" BlocC bar"),它们成为BlocC数组的子文档。
我正在使用nodeJS来做到这一点。我虽然使用递归来做这件事,但对我来说这有点太棘手了。
还有另一种方法可以实现这个目标(使用解析器或其他方法)吗?
感谢您的帮助。
答案 0 :(得分:0)
你可以试试这个:
const fs = require('fs')
let prop, subProp, json = {}
fs.readFile('data.txt', 'utf8', (err, data) => {
data.split(/\r?\n/)
.filter(line => line.search(/\S/) > -1)
.reduce((obj, line) => {
// array members
if(line.search(/^\s+/) > -1) {
subProp ?
obj[prop][obj[prop].length - 1][subProp].push(line.trim()) :
obj[prop].push(line.trim())
} else {
// sub property
if(line.search(/\s+/) > -1) {
var props = line.split(/\s+/)
prop = props[0].trim()
subProp = props[1].trim()
Array.isArray(obj[prop]) || (obj[prop] = [])
obj[prop].push({
[subProp]: []
})
} else {
prop = line.trim()
subProp = null
obj[prop] = []
}
}
return obj
}, {})
console.log(json)
})