2017-05-03 20 views
3

私はこれらの質問をお読みください。csvをJSONツリー構造に変換しますか?

私はまだJSONのための階層にcsvファイルを変換することができないんだが。私がstackoverflowで見つけたスクリプトは、特定の問題に特有のものです。

condition target sub 
oxygen  tree G1 
oxygen  tree G2 
water  car  G3 
water  tree GZ 
fire  car  GTD 
oxygen  bomb GYYS 

これは(限り私が試したとして)このようなJSONファイルになります::さんがグループ化する必要がある三つの変数があるとしましょう

oxygen 
    - tree 
     - G1 
     - G2 
    - bomb 
     -GYYS 
water 
    - car 
     - G3 
    - tree 
     -GZ 
fire 
    - car 
     - GTD 

そして、これらをグループ化する必要があります入れ子構造のように:

{ 
    "name": "oxygen", 
    "children": [ 
    { 
    "name": "tree", 
    "children": [ 
     {"name": "G1"}, 
     {"name": "G2"}, 
     {"name": "GYYS"} 
    ] 
    }, 
    { 
    "name": "bomb", 
     "children": [ 
     {"name": "GYYS"} 
    ] 
    } 
    ] 
} 
etc. 

私はそのようなflare.jsonを作ることができる汎用的な機能を作ることができていないよしかし、このサイト上のすべてのスクリプトを試してみました。私は私のコードを投稿することができますが、これは上記のリンクのようなものです。だから私はこれをフレアに変換する簡単なコード(または私を助けることができる例)を求めています.JSONのような構造。

+0

「3つの変数」はjsonの例のどこにも表示されませんが、明白な接続はありません。ですから、csvファイルのデータからjson構造体を生成する方法を詳しく説明してください。 –

+0

私はJSONについてよく知らないですが、私が望むものの短い例を挙げてみました(編集を参照)@ChristianKönig – CodeNoob

+0

できますか、 jsonの例をhttp://jsoneditoronline.org/このviewer/validatorにコピーして貼り付け、jsonの例が有効なjsonではないため、有効なjsonの例を少なくとも提供してください。また、csvをjsonに変換する方法(子供たちになる理由)とその理由についてのルール(ハイレベルロジック)を提供してください。 これらの情報は、あなたに有効な回答を与えるのに役立ちます。 – Hett

答えて

4

collectionsからのdefaultdictを使用すると、標準ライブラリは、簡単で解決可能な階層構造に多くの問題を引き起こしています。だから私はあなたの問題のためのサンプルソリューションを開発しました。しかし、スクリプトを実行する前に、csvファイル(test.csvという名前)をカンマ区切りにしてください。あるいは、csv readerのロジックを変更することもできます。

ここでは、スクリプトをテストしたcsvファイルを示します。

condition, target, sub, dub 
oxygen,tree,G1,T1 
oxygen,tree,G2,T1 
oxygen,tree,G2,T2 
water,car,G3,T1 
water,tree,GZ,T1 
water,tree,GZ,T2 
fire,car,GTD,T3 
oxygen,bomb,GYYS,T1 

技術的には、さまざまなサイズの任意の種類のcsvファイルに対してスクリプトが機能するはずです。しかし、あなたは自分でそれをテストして確実にする必要があります。

import csv 
from collections import defaultdict 


def ctree(): 
    """ One of the python gems. Making possible to have dynamic tree structure. 

    """ 
    return defaultdict(ctree) 


def build_leaf(name, leaf): 
    """ Recursive function to build desired custom tree structure 

    """ 
    res = {"name": name} 

    # add children node if the leaf actually has any children 
    if len(leaf.keys()) > 0: 
     res["children"] = [build_leaf(k, v) for k, v in leaf.items()] 

    return res 


def main(): 
    """ The main thread composed from two parts. 

    First it's parsing the csv file and builds a tree hierarchy from it. 
    Second it's recursively iterating over the tree and building custom 
    json-like structure (via dict). 

    And the last part is just printing the result. 

    """ 
    tree = ctree() 
    # NOTE: you need to have test.csv file as neighbor to this file 
    with open('test.csv') as csvfile: 
     reader = csv.reader(csvfile) 
     for rid, row in enumerate(reader): 

      # skipping first header row. remove this logic if your csv is 
      # headerless 
      if rid == 0: 
       continue 

      # usage of python magic to construct dynamic tree structure and 
      # basically grouping csv values under their parents 
      leaf = tree[row[0]] 
      for cid in range(1, len(row)): 
       leaf = leaf[row[cid]] 

    # building a custom tree structure 
    res = [] 
    for name, leaf in tree.items(): 
     res.append(build_leaf(name, leaf)) 

    # printing results into the terminal 
    import json 
    print(json.dumps(res)) 


# so let's roll 
main() 

そしてここでは、結果からJSONセグメントです:

{ 
    "name": "oxygen", 
    "children": [ 
     { 
     "name": "tree", 
     "children": [ 
      { 
      "name": "G2", 
      "children": [ 
       { 
       "name": "T2" 
       }, 
       { 
       "name": "T1" 
       } 
      ] 
      }, 
      { 
      "name": "G1", 
      "children": [ 
       { 
       "name": "T1" 
       } 
      ] 
      } 
     ] 
     }, 
     { 
     "name": "bomb", 
     "children": [ 
      { 
      "name": "GYYS", 
      "children": [ 
       { 
       "name": "T1" 
       } 
      ] 
      } 
     ] 
     } 
    ] 
    } 

してください、ご不明な点や問題がある場合は私に知らせてください。 ハッピーpythonning;)

+0

ありがとうございました!スタック上の他の回答と同じように理解するのがはるかに簡単です – CodeNoob

+0

これは役に立ちました! – Hett

関連する問題