2016-08-23 24 views
1

從文本文件創建結構化JSON時遇到一些困難。下面是文本文件從文本文件中遞歸構建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名稱後跟一個字符串(如「BlocC foo」和「BlocC bar」),它成爲BlocC數組的子文檔。

我使用nodeJS來做到這一點。我雖然這樣做使用遞歸,但對我來說有點太棘手。

是否有另一種方法來完成這一點(用解析器或其他)?

謝謝你的幫助。

回答

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) 

}) 
+0

太好了,謝謝! –