2016-08-23 13 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"]} 
] 
} 

、圏は常に行の最初の文字から始まり、ブロックの性質があります少なくとも空白文字で始まります。

ブロック名の後には、BlocC配列のサブ文書となる文字列( "BlocC foo"や "BlocC bar"など)が続きます。

私はそれを行うために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

グレート、ありがとうございます! –

関連する問題