将CSV转换为嵌套JSON复杂结构

时间:2019-08-12 02:35:17

标签: json python-3.x csv nested

我目前是python的新手,我们有一个csv文件,需要将其转换为嵌套的JSON文件。

name      type  aitm      alitm     aaitm           adsc1   
specs     glass 70072187  ESA65Z45  ESA 65Z45       CUT TIP FG 1808-40  

我正在尝试以以下json格式构建以上数据

{
  "entities": [
    {
      "name": "spec",
      "type": "glass",
      "data": {
        "attributes": {
          "aitm": {
            "values": [
              {
                "value": "70072187",
                "source": "internal",
                "locale": "en_US"
              }
            ]
          },
          "alitm": {
            "values": [
              {
                "value": "ESA65Z45",
                "source": "internal",
                "locale": "en_US"
              }
            ]
          },
          "aaitm": {
            "values": [
              {
                "value": "ESA 65Z45",
                "source": "internal",
                "locale": "en_US"
              }
            ]
          },
          "adsc1": {
            "values": [
              {
                "value": "CUT TIP FG",
                "source": "internal",
                "locale": "en_US"
              }
            ]
          }
        }
      }
    }
  ]
}

在上述JSON中,有一些csv源和语言环境中不存在的值在数据中不存在,但是我需要将这些值合并到结构中。

我尝试过使用python和R,但由于我也尝试过使用这种复杂的JSON结构,所以我们无法成功     详细信息= df.groupby(['name','type'])。apply(     lambda r:r [[''aitm','alitm']]。to_dict(orient ='records'))

nested = details.unstack('name')


pprint(grouped.unstack('name').to_dict())


output = nested.apply(lambda s: [
{s.index.name: idx, 'Details': value}
for idx, value in s.items()
]).to_dict('records')

print(output)

我得到的结构不正确。请提出使用python解决此问题的方法。

1 个答案:

答案 0 :(得分:0)

Python具有Mathf.Approximately(例如)的包装器,因此您可能会对以下使用jq的解决方案感兴趣,特别是因为Q表示您在任何情况下都考虑了python的替代方法。请注意,下面的解决方案在数据允许的范围内是“数据驱动的”。特别是,将处理任意多列。

在下面,我假设输入实际上是CSV(逗号分隔的值),用正则表达式“ *,*”进行分割就足够了。如果输入更为复杂,则将其转换为更常规的格式(例如TSV。

def toa: [splits(" *, *")];

def column($n; $headers):
  { ($headers[$n]) :
      { values: [{value: .[$n], source: "internal", locale: "en_US"}] }
  };

toa as $headers
| [ inputs
    | toa
    | {name: .[0],
       type: .[1],
       data: { attributes:
                ([range(2; $headers|length) as $col
                 | column($col; $headers) ] | add)
             }
      }]
| {entities: .}

调用

从命令行说明用法最简单。使用上面的程序将其保存在名为csv2json.jq的文件中,并将数据存储在input.csv中:

jq -R -f csv2json.jq input.csv