繁体   English   中英

如何在jq中为CSV导出添加标题?

[英]How to add a header to CSV export in jq?

我正在从jq 教程中修改命令:

curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' \
| jq -r -c '.[] | {message: .commit.message, name: .commit.committer.name} | [.[]] | @csv'

哪个csv导出很好,但缺少标题作为顶部:

"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"

如何在顶部添加标题(在本例中为message,name )? (我知道它可以手动,但如何在jq内完成?)

只需在值前面的数组中添加标题文本即可。

["Commit Message","Committer Name"], (.[].commit | [.message,.committer.name]) | @csv

根据Anton对Jeff Mercado的回答的评论,这段代码将获取第一个元素的属性的关键名称,并在行之前将它们作为数组输出,从而将它们用作标题。 如果不同的行具有不同的属性,那么它将无法正常工作; 然后再次,结果CSV也不会。

map({message: .commit.message, name: .commit.committer.name}) | (.[0] | to_entries | map(.key)), (.[] | [.[]]) | @csv

虽然我完全意识到OP正在寻找纯粹的jq答案,但我发现这个问题正在寻找任何答案。 所以,让我提供一个我发现(并发现有用)给我这样的人。

  1. sudo apt install moreutils - 如果你还没有它们。 Moreutils网站
  2. echo "Any, column, name, that, is, not, in, your, json, object" | cat - your.csv | sponge your.csv

缺点:需要moreutils包,不仅仅是jq -reliant,所以有些人会说不那么优雅。

优点:您选择标题,而不是JSON键。 此外, jq方式会受到键的排序的影响, 具体取决于您的版本

它是如何工作的?

  1. echo输出你的标题
  2. cat - 从stdin(cause - )获取e​​cho输出并使用csv文件对其进行conCATenate
  3. 海绵等待直到完成并将结果写入同一文件,覆盖它。

但你可以用tee做到这一点,而无需安装任何包!

不,你不能,正如科斯在这里所展示的那样 除非你在某些时候失去你的csv是好的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM