我如何使用 (Go) yq 将 YAML 文档缩减为一组所需的键并生成 CSV?

How can I use (Go) yq to reduce a YAML document to a desired set of keys and produce a CSV?

我有以下 YAML 文档:

222:
  description:
    en: "124098-en"
    fr: "498438-fr"
  name:
    en: "293878-en"
    fr: "222493878-fr"
  mass: 0.1
  groupID: "24902"
223:
  description:
    en: "124098-en"
    fr: "498438-fr"
  name:
    en: "zz325-en"
    fr: "222493878-fr"
  mass: 0.1
  groupID: "234988"
[many other records]

我想构建一个如下所示的 CSV:

222,"293878-en","24902"
223,"zz325-en","234988"

也就是说,每一行只是:

原始文档的 CSV 中没有保留其他字段。

正确的做法是什么?

附录: 我正在使用 yq (4.7.1) 的 Go 版本,但 Go 或 Python 版本都可以,或者如果不是这里是正确的工具,我很乐意使用其他工具。

Python yq 版本使用起来更直接,因为它实际上使用 jq 在引擎盖下对从 YAML 转换的 JSON 进行操作。

您可以使用 jq 的结构并将 CSV 结果作为

yq -r 'keys_unsorted[] as $k | [ ($k|tonumber), (.[$k] | .name.en, .groupID) ] | @csv' yaml

@csv 函数将数组中收集的元素放入源中最初编码的本机类型。如果 groupID 打算存储为字符串,则可以 .groupID | tostring


Go yq 在 v4 之前非常独特,当时它使用自己的 DSL,但现在 v4.8 它非常努力地实现 jq 的功能。它还没有开箱即用的 CSV 功能。

yq 的最新版本 (4.16+) 现在具有“@csv”运算符

yq e '.[] | [key, .name.en, .groupID] | @csv' file.yaml

免责声明:我写了yq