我有以下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"
也就是说,每一行都只是:
- 第一个字段:原始文档中映射的键
- 第二个字段:原始文档中的
.[].name.en
- 第三个字段:原始文档中的
.[].groupID
CSV中不会保留原始文档中的其他字段。
做这件事的正确方法是什么?
附录:我使用的是yq的Go版本(4.7.1(,但Go或Python版本都可以,或者如果这不是正确的工具,我很乐意使用其他工具。
最新版本的yq
(4.16+(现在具有"@csv"运算符
yq e '.[] | [key, .name.en, .groupID] | @csv' file.yaml
免责声明:我写了yq
Pythonyq
版本使用起来要简单得多,因为它实际上是在后台使用jq
来操作从YAML转换而来的JSON。
您可以使用jq
的构造并获得作为的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功能。