【问题标题】:Convert CSV to Nested JSON complex structure将 CSV 转换为嵌套的 JSON 复杂结构
【发布时间】:2019-08-12 02:35:17
【问题描述】:

我目前是 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 结构,我们无法成功 details = 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 解决此问题的方法。

【问题讨论】:

  • 这似乎是一个相对简单的任务。您需要做的是使用 csv 模块打开 csv 并遍历每一行。我假设 csv 中的每一行都是它自己的 JON 字典?
  • 是的 - 如果可能的话,你能帮忙写代码吗?我试过但失败了

标签: json python-3.x csv nested


【解决方案1】:

Python 具有 的包装器(例如 https://pypi.org/project/pyjq/),因此您可能对以下使用 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

【讨论】:

  • 感谢您的解决方案。我尝试安装 pyjq 并收到错误代码为 1 的文件。我也尝试在不同的工作站上遇到相同的错误。仅供参考:我们正在使用 windows
  • 有两个可用的 python 绑定(pip install jq; pip install pyjq)但在尝试第二种选择之前,我建议直接安装 jq,例如使用choco install jq
  • 感谢您的建议。 choco install jq 已安装。但是我们无法执行 Invocation 方法,因为我们使用的是带有 Anaconda Jupyter IDE 的 windows 机器。请帮助我们。
  • 很遗憾,我无法在 IDE 方面提供帮助,但您应该能够直接在 Windows 命令行提示符下运行 jq。 (有关更多信息,请参阅例如docs.microsoft.com/en-us/windows-server/administration/…。)
  • 在 Visual Studio 代码中使用 powershell 我能够执行您的 jq 脚本。如何根据每一行将其写入 .JSON 文件
猜你喜欢
  • 2019-12-20
  • 1970-01-01
  • 2020-01-16
  • 2020-09-29
  • 2022-11-22
  • 1970-01-01
  • 2018-01-07
  • 2020-10-28
相关资源
最近更新 更多