2

我有以下 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"

也就是说,每一行只是:

  • 第一个字段:原始文档中地图的key
  • 第二个字段:.[].name.en来自原始文档
  • 第三个字段:.[].groupID来自原始文档

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

这样做的正确方法是什么?

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

4

2 回答 2

2

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

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

免责声明:我写了 yq

于 2021-12-05T00:50:36.160 回答
1

Pythonyq版本使用起来要简单得多,因为它实际上是在底层使用jq从 YAML 转换而来的 JSON 进行操作。

您可以使用jq's 构造并将 CSV 结果作为

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

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


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

于 2021-05-10T14:29:19.783 回答