我如何使用 (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"
也就是说,每一行只是:
- 第一个字段:原文档中map的key
- 第二个字段:来自原始文档
.[].name.en
的
- 第三个字段:来自原始文档的
.[].groupID
原始文档的 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
我有以下 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"
也就是说,每一行只是:
- 第一个字段:原文档中map的key
- 第二个字段:来自原始文档
.[].name.en
的 - 第三个字段:来自原始文档的
.[].groupID
原始文档的 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