簡體   English   中英

從flat csv創建嵌套的JSON

[英]Create nested JSON from flat csv

嘗試基於此示例從csv創建4個深層嵌套JSON:

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 */ ]
    }

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

按照python中遞歸函數的思路思考但到目前為止這種方法還沒有取得多大成功...對快速簡便解決方案的任何建議都非常感激?

更新:逐漸放棄總結成本的想法,因為我無法弄明白:(。我還不是一個python編碼器)! 只需能夠生成格式化的JSON就足夠了,如果必須的話,我可以稍后插入數字。

一直在閱讀,谷歌搜索和閱讀解決方案,並在途中學到了很多,但仍然沒有成功從上面的CSV結構創建我的嵌套JSON文件。 網上某處必須是一個簡單的解決方案嗎? 也許其他人的搜索條件更幸運了????

這里有一些提示。

使用csv.reader將輸入解析為列表列表:

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

循環遍歷列表以構建字典並總結成本。 根據您要創建的結構,構建可能如下所示:

>>> 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM