【问题标题】:How to add a header to CSV export in jq?如何在 jq 中向 CSV 导出添加标题?
【发布时间】:2015-07-12 23:28:58
【问题描述】:

我正在从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 导出效果好,但顶部缺少标题:

"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 内完成呢?)

【问题讨论】:

标签: json csv jq


【解决方案1】:

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

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

【讨论】:

  • 谢谢,杰夫!当您必须修改所选列时,有什么方法可以在不重复标题的情况下处理这种情况?
  • 我不确定您是否可以在那里做很多事情。您需要为所需的每个值添加一个标题列。你有一个具体的例子来说明你正在尝试做什么?
  • 我打算在多个示例中使用它,所以原始示例是正确的模式。我尝试像你的 stackoverflow.com/a/27132468/911945 那样使用 map() 函数,但没有成功。
【解决方案2】:

基于 Anton 对 Jeff Mercado 的回答的 cmets,此 sn-p 将获取第一个元素的属性的键名,并将它们作为数组输出到行之前,从而将它们用作标题。如果不同的行有不同的属性,那么它就不能很好地工作;再说一次,生成的 CSV 也不会。

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

【讨论】:

  • 非常感谢,圣地亚哥!我刚刚发现此方法按名称对标题进行排序,但不对相应的列进行排序。有什么办法可以避免吗?
  • 暂时我通过使用前缀“c1_”、“c2_”、“c3_”等命名标题来解决“排序标题”问题。不优雅但有效。很高兴知道使用地图添加标题的正确方法,但没有自动排序的标题!
  • 这个线程中的解决方案已经为我正确解决了(没有解决方法)。它做同样的事情,但没有对键进行排序。 github.com/stedolan/jq/issues/48#issuecomment-12398967
【解决方案3】:

虽然我完全意识到 OP 正在寻找一个 purely jq 答案,但我发现这个问题正在寻找 any 答案。所以,让我将我发现(并且发现有用)的一个提供给像我这样的其他人。

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

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

优点:您可以选择标头,而不是 JSON 键。此外,纯粹的 jq 方式会受到键的排序 depending on your version 的困扰。

它是如何工作的?

  1. echo 输出你的标题
  2. cat - 从 stdin 获取 echo 输出(原因 -)并将其与 csv 文件合并
  3. sponge 一直等到完成,然后将结果写入同一个文件,并覆盖它。

但您可以使用 tee 来完成,而无需安装任何软件包!

不,你不能,就像Kos excellently demonstrates here。除非您可以在某个时候丢失 csv,否则不会。

【讨论】:

  • "纯 jq 方式会被键的排序所困扰" - 这仅适用于有缺陷或自以为是的程序。
  • 为什么不直接将文本作为 JSON 文本回显到 jq 中,而不使用更多实用程序?
猜你喜欢
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2020-04-23
  • 2018-10-16
  • 1970-01-01
  • 2020-11-08
相关资源
最近更新 更多