18

我有以下 JSON 数据:

{"id":"111","case":"Y","custom":{"speech invoked":"no","input method":"hard","session ID":"420"}}

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

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

111,Y,420,no,hard

我尝试了以下方法,但没有奏效:

{(.id),(.case),(.custom."session Id"),(.custom."speech invoked"),(.custom."input method")}

如果不可能,任何 perl 或 shell 解决方案都会受到赞赏。

4

5 回答 5

22

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

jq -r '[.case, .custom."speech invoked", .custom."input method"] | @csv'
于 2015-07-02T09:41:47.800 回答
18

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

首先制作您需要的输出数组,然后使用逗号连接数组元素。

jq -r '[.case, .custom."speech invoked", .custom."input method"] | join(", ")'

享受。:)

于 2014-11-07T21:29:48.003 回答
11

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

with_entries(select(.key != "custom")) + .custom
    | to_entries
    | map(.key), map(.value)
    | @csv

请注意,以这种方式编写,“自定义”属性将始终写入最后,无论属性的顺序如何。

于 2014-11-25T16:59:10.127 回答
1

这是另一个解决方案。如果data.json包含样本数据,则

jq -M -s -r 'map(.+.custom|del(.custom)) | (.[0]|keys_unsorted), (.[]|[.[]]) | join(",")' data.json

会产生

id,case,speech invoked,input method,session ID
111,Y,no,hard,420
于 2017-09-01T21:53:31.337 回答
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;
于 2014-08-28T23:05:14.583 回答