2011-10-30 38 views
2

創建嵌套JSON試圖創建從基於該例子的CSV 4深嵌套JSON:從平面CSV

Region,Company,Department,Expense,Cost 
Gondwanaland,Bobs Bits,Operations,nuts,332 
Gondwanaland,Bobs Bits,Operations,bolts,254 
Gondwanaland,Maureens Melons,Operations,nuts,123 

在每個級別我想總結的成本和在包括在所輸出的JSON相關的水平。

輸出的JSON的結構應該是這個樣子:

{ 
      "id": "aUniqueIdentifier", 
      "name": "usually a nodes name", 
      "data": [ 
       { 
         "key": "some key", 
         "value": "some value" 
       }, 
       { 
         "key": "some other key", 
         "value": "some other value" 
       } 
      ], 
      "children": [/* other nodes or empty */ ] 
    } 

(REF:http://blog.thejit.org/2008/04/27/feeding-json-tree-structures-to-the-jit/

沿蟒蛇遞歸函數的行思考,但還沒有與這麼多的成功到目前爲止...任何建議快速和簡單的解決方案非常讚賞?

更新: 逐漸放棄總結成本的想法,因爲我只是無法弄清:(:(我不是很多python編碼器)!只要能夠產生格式化的JSON是不夠好,我可以在數字更高版本的插件,如果我不得不這樣做。

一直在讀,谷歌搜索和閱讀的解決方案,並在途中學到了很多,但仍處於從上述CSV strucutre創建我的嵌套JSON文件沒有成功。必須是網絡上某個簡單的解決方案?也許其他人有更多的運氣與他們的搜索字詞?

+0

如果這是作業,請將其標記爲這樣。 –

+0

都能跟得上其性實驗與政府由一個新手預算的數據可視化...試圖把15000個記錄到一個不錯的樹形圖與需求點(thejit.org)。已經被谷歌搜索和試驗整天沒有運氣......很多類似的事情,但沒有爲我工作呢。 – spadeisaspade

+1

夠公平的。我可以告訴你如何將行分組寫入嵌套數據結構,但我不清楚示例輸入中的字段如何映射到目標結構。你可以發佈預期的確切json輸出嗎? –

回答

8

下面是一些提示。

解析輸入到一個列表的列表與csv.reader

>>> rows = list(csv.reader(source.splitlines())) 

遍歷列表中buildi你的字典和總結了成本。根據不同的結構,你正在尋找創造的積累可能是這個樣子:

>>> summary = [] 
>>> for region, company, department, expense, cost in rows[1:]: 
    summary.setdefault(*region, company, department), []).append((expense, cost)) 

結果寫出來與那樣json.dump

>>> json.dump(summary, open('dest.json', 'wb')) 

希望,遞歸函數下面會幫助你開始。它從輸入構建一棵樹。請注意是什麼類型的,你想你的葉子是,我們將此視爲「成本」。您需要詳細說明如何建立您想要的確切結構的功能:

import csv, itertools, json 

def cluster(rows): 
    result = [] 
    for key, group in itertools.groupby(rows, key=lambda r: r[0]): 
     group_rows = [row[1:] for row in group] 
     if len(group_rows[0]) == 2: 
      result.append({key: dict(group_rows)}) 
     else: 
      result.append({key: cluster(group_rows)}) 
    return result 

if __name__ == '__main__': 
    s = '''\ 
Gondwanaland,Bobs Bits,Operations,nuts,332 
Gondwanaland,Bobs Bits,Operations,bolts,254 
Gondwanaland,Maureens Melons,Operations,nuts,123 
''' 
    rows = list(csv.reader(s.splitlines())) 
    r = cluster(rows) 
    print json.dumps(r, indent=4) 
+0

它僅顯示這樣做:'{ 「岡瓦納古陸」: { 「鮑勃位」: { 「操作」: 「堅果」 ] } ], 「Maureens瓜」:[ { 「操作」:[ 「堅果」 ] } ] } ] }'第二行'岡瓦納,鮑勃位,操作,螺栓,254'沒有顯示。另外,如何將最後一列添加爲值(nuts:332)?你能幫忙嗎? – user602599

+1

固定了最後一級分組。感謝您注意這個問題。 –