如何在 jq 中将 header 添加到 CSV 导出?
How to add a header to CSV export in jq?
我正在从 jq
tutorial:
中获取经过修改的命令
curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' \
| jq -r -c '.[] | {message: .commit.message, name: .commit.committer.name} | [.[]] | @csv'
哪个 csv
导出良好,但缺少 header 作为顶部:
"Fix README","Nicolas Williams"
"README: send questions to SO and Freenode","Nicolas Williams"
"usage() should check fprintf() result (fix #771)","Nicolas Williams"
"Use jv_mem_alloc() in compile.c (fix #771)","Nicolas Williams"
"Fix header guards (fix #770)","Nicolas Williams"
如何在顶部添加 header(在本例中为 message,name
)? (我知道可以手动操作,但是如何在 jq
内完成?)
只需在值前面的数组中添加 header 文本。
["Commit Message","Committer Name"], (.[].commit | [.message,.committer.name]) | @csv
根据 Anton 对 Jeff Mercado 的回答的评论,此代码段将获取第一个元素的属性的键名称,并将它们作为行前的数组输出,因此将它们用作 headers。如果不同的行具有不同的属性,那么它就不会很好地工作;然后,生成的 CSV 也不会。
map({message: .commit.message, name: .commit.committer.name}) | (.[0] | to_entries | map(.key)), (.[] | [.[]]) | @csv
虽然我完全意识到 OP 正在寻找 purely jq 答案,但我发现这个问题正在寻找 any 答案。所以,让我向像我一样的其他人提供我发现(并且发现有用)的一个。
sudo apt install moreutils
- 如果您还没有。 Moreutils website.
echo "Any, column, name, that, is, not, in, your, json, object" | cat - your.csv | sponge your.csv
缺点:需要 moreutils
包,不只是 jq
-依赖,所以有些人会说不够优雅,这是可以理解的。
优点:您选择 header 键,而不是 JSON 键。此外,纯jq
方式受到键排序的困扰,depending on your version。
它是如何工作的?
- echo 输出你的 header
- cat - 从 stdin 获取 echo 输出(原因 -)并将其与您的 csv 文件合并
- sponge 等到完成并将结果写入同一个文件,覆盖它。
但是您可以使用 tee
来完成,而无需安装任何软件包!
不,你不能,因为 Kos excellently demonstrates here。除非你在某个时候丢失你的 csv 没问题。
我正在从 jq
tutorial:
curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' \
| jq -r -c '.[] | {message: .commit.message, name: .commit.committer.name} | [.[]] | @csv'
哪个 csv
导出良好,但缺少 header 作为顶部:
"Fix README","Nicolas Williams"
"README: send questions to SO and Freenode","Nicolas Williams"
"usage() should check fprintf() result (fix #771)","Nicolas Williams"
"Use jv_mem_alloc() in compile.c (fix #771)","Nicolas Williams"
"Fix header guards (fix #770)","Nicolas Williams"
如何在顶部添加 header(在本例中为 message,name
)? (我知道可以手动操作,但是如何在 jq
内完成?)
只需在值前面的数组中添加 header 文本。
["Commit Message","Committer Name"], (.[].commit | [.message,.committer.name]) | @csv
根据 Anton 对 Jeff Mercado 的回答的评论,此代码段将获取第一个元素的属性的键名称,并将它们作为行前的数组输出,因此将它们用作 headers。如果不同的行具有不同的属性,那么它就不会很好地工作;然后,生成的 CSV 也不会。
map({message: .commit.message, name: .commit.committer.name}) | (.[0] | to_entries | map(.key)), (.[] | [.[]]) | @csv
虽然我完全意识到 OP 正在寻找 purely jq 答案,但我发现这个问题正在寻找 any 答案。所以,让我向像我一样的其他人提供我发现(并且发现有用)的一个。
sudo apt install moreutils
- 如果您还没有。 Moreutils website.echo "Any, column, name, that, is, not, in, your, json, object" | cat - your.csv | sponge your.csv
缺点:需要 moreutils
包,不只是 jq
-依赖,所以有些人会说不够优雅,这是可以理解的。
优点:您选择 header 键,而不是 JSON 键。此外,纯jq
方式受到键排序的困扰,depending on your version。
它是如何工作的?
- echo 输出你的 header
- cat - 从 stdin 获取 echo 输出(原因 -)并将其与您的 csv 文件合并
- sponge 等到完成并将结果写入同一个文件,覆盖它。
但是您可以使用 tee
来完成,而无需安装任何软件包!
不,你不能,因为 Kos excellently demonstrates here。除非你在某个时候丢失你的 csv 没问题。