如何使用jq将我的JSON转换为CSV?

use*_*819 17 csv shell perl json jq

我有以下JSON数据:

{"id":"111","case":"Y","custom":{"speech invoked":"no","input method":"hard","session ID":"420"}}
Run Code Online (Sandbox Code Playgroud)

如何使用jq将其转换为CSV格式,所以我的结果如下所示?

id,case,session Id,speech invoked,input method

111,Y,420,no,hard
Run Code Online (Sandbox Code Playgroud)

我尝试了以下,但它不起作用:

{(.id),(.case),(.custom."session Id"),(.custom."speech invoked"),(.custom."input method")}
Run Code Online (Sandbox Code Playgroud)

如果不可能,任何perl或shell解决方案都是值得赞赏的.

Oli*_*ert 22

在Joe Harris的回答的基础上,您可以使用@csv过滤器,以便在必要时正确引用和转义字符串:

jq -r '[.case, .custom."speech invoked", .custom."input method"] | @csv'
Run Code Online (Sandbox Code Playgroud)


Joe*_*ris 18

使用perl对我来说不是一个好的解决方案,但经过一些试验和错误后我发现你只需jq使用join()运算符即可.

首先创建所需输出的数组,然后使用逗号连接数组元素.

jq -r '[.case, .custom."speech invoked", .custom."input method"] | join(", ")'
Run Code Online (Sandbox Code Playgroud)

请享用.:)


Jef*_*ado 11

使用jq,您可以使用此过滤器:

with_entries(select(.key != "custom")) + .custom
    | to_entries
    | map(.key), map(.value)
    | @csv
Run Code Online (Sandbox Code Playgroud)

请注意,以这种方式编写,无论属性的顺序如何,"自定义"属性最终都会写入.


cho*_*oba 0

使用 Perl 及其 JSON 模块:

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

use JSON;

my $input = << '__JSON__';
{"id":"111","case":"Y","custom":{"speech invoked":"no","input method":"hard","session ID":"420"}}
__JSON__

my $struct = decode_json($input);

my @header = grep ! ref $struct->{$_}, keys %$struct;
push @header, map keys %{ $struct->{$_} },
              grep ref $struct->{$_},
              keys %$struct;

my @row = grep ! ref, values %$struct;
push @row, map values %$_, grep ref, values %$struct;

say join ',', @header;
say join ',', @row;
Run Code Online (Sandbox Code Playgroud)

  • 这不像问题所问的那样使用“jq”。 (2认同)
  • 不知道为什么这个解决方案被否决。`jq` 绝对比 Perl 更受青睐,但问题是“任何 Perl 或 shell 解决方案都值得赞赏”。 (2认同)