Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 如何在jq中向CSV导出添加标题?_Json_Csv_Jq - Fatal编程技术网

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

Json 如何在jq中向CSV导出添加标题?,json,csv,jq,Json,Csv,Jq,我正在从jq获取一个修改过的命令: 哪个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)","N

我正在从
jq
获取一个修改过的命令:

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

如何在顶部添加标题(在本例中为
消息,名称
)?(我知道可以手动执行,但如何在
jq
?)中执行)

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

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

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


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

当我完全意识到OP在寻找一个纯粹的jq答案时,我发现这个问题在寻找任何答案。所以,让我为像我这样的人提供一个我发现的(并且发现有用的)

  • sudo-apt-install-moreutils
    -如果您还没有
  • echo“Any,column,name,that,is,not,in,your,json,object”| cat-your.csv | scape your.csv
  • 缺点:需要
    moreutils
    包,不只是依赖于
    jq
    ,所以有些人会说不够优雅,这是可以理解的

    优点:您可以选择标题,而不是JSON键。此外,纯粹的
    jq
    方式也会被键的排序所困扰

    它是如何工作的?
  • echo输出你的标题
  • cat-从stdin(原因-)获取回声输出,并将其与csv文件连接起来
  • 海绵等待,直到完成,并将结果写入同一文件,覆盖它
  • 但是您可以使用
    tee
    来完成,而无需安装任何软件包!
    不,你不能,因为。除非你对在某个时候丢失csv感到满意。

    谢谢,杰夫!当你必须修改所选的列时,有没有办法不重复标题来处理这些情况呢?我不确定你能做些什么。您需要为所需的每个值添加一个标题列。你有没有一个具体的例子来说明你想做什么?我计划在多个例子中使用它,所以最初的例子是正确的模式。我试着像你一样使用
    map()
    函数,但没有成功。我的一些。非常感谢,圣地亚哥!我刚刚发现,该方法按名称对标题进行排序,但不对相应的列进行排序。有什么办法可以避免这种情况吗?目前,我通过使用前缀“c1_u”、“c2_u”、“c3_u”等命名标题来解决“排序标题”问题。虽然不雅致,但很有效。最好知道一种使用map添加标题的正确方法,而不用自动排序标题!这个线程中的解决方案已经为我正确地解决了这个问题(没有解决方法)。它做同样的事情,但没有排序的关键。“纯粹的jq方式被键的排序所困扰”——这只适用于有缺陷或专横的程序。
    ["Commit Message","Committer Name"], (.[].commit | [.message,.committer.name]) | @csv