Конвертировать. json данные в MATRIX для электронной таблицы - PullRequest
0 голосов
/ 20 марта 2020

У меня есть список из ~ 200 кодов, которые выглядят следующим образом:

EB0016
EB0017
EB0018
EB0019
EB0021
EB0023
EB0024
EB0026
EB0027

Через систему в моей работе различные «родительские» коды в списке 200 помещаются в бизнес-отчеты вместе с подмножество соответствующих «дочерних» кодов, также из того же списка из 200, как показано в блоке кода ниже.

Чтобы пояснить значения ниже, для каждого отчета, в котором размещен родительский код кода EB0016, мы также см. дочерний код EB0148 в 15,8% случаев вместе с дочерним кодом EB0192 в 13,7% случаев и т. д. c. И всякий раз, когда мы видим размещенный код EB0017, мы также видим, что EB0187 размещается в 13,6% времени и т. Д. c. В приведенном ниже примере EB0016 и EB0017 являются родительскими значениями, и мы можем видеть дочерние значения вместе с процентом в десятичном формате.

В файле json каждый родительский код указан только один раз, поэтому 200 родителей. Для каждого из 200 родителей в списке указаны дочерние коды, и каждому дочернему элементу соответствует соответствующая десятичная частота, показывающая, как часто мы видим этот конкретный дочерний код, помещенный ДЛИНО вместе с родительским кодом.

Все родительские и дочерние коды находятся в одном и том же списке из 200, и поэтому у меня теперь есть данные, где я могу создать полную матрицу.

У меня вопрос, как я могу преобразовать этот json файл в CSV-файл, который затем можно импортировать в электронную таблицу? Обычно я пытался сделать удар по некоторому коду и затем опубликовать для получения дополнительной помощи, но я полностью застрял в том, как я бы сделал это после многих поисков уже. Возможно awk?

 {
   "EB0016": {
        "EB0148": 0.1581,
        "EB0192": 0.1372,
        "EB0135": 0.1177,
        "EB0147": 0.0867,
        "EB0110": 0.0822,
        "EB0107": 0.0697
    },
   "EB0017": {
        "EB0187": 0.1364,
        "EB0148": 0.1312,
        "EB0192": 0.093,
        "EB0147": 0.0847
    }
}

Я хотел бы взять вышеуказанный файл json (я перечислил 2 родительских кода, но на самом деле их около 200) и сгенерировать такую ​​матрицу:

        EB0107  EB0110  EB0135  EB0147  EB0148  EB0187  EB0192
EB0016  0.0697  0.0822  0.1177  0.0867  0.1581  -       0.1372
EB0017  -       -       -       0.0847  0.1312  0.1364  0.093

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Я не понимаю, как этот сэмпл будет генерировать этот вывод, но вот снимок в темноте с использованием GNU awk и расширения json:

$ gawk '
@load "json"
BEGIN{
    OFS="\t"
    PROCINFO["sorted_in"]="@ind_str_asc"
}
{
    json=json $0
    if(json_fromJSON(json,array)!=0) {
        for(i in array)
            for(j in array[i])
                header[j]
        for(i in header)
            printf "%s%s%s",(++c==1?OFS:""),i,(c==length(header)?ORS:OFS)
        for(i in array) {
            c=0
            printf "%s%s",i,OFS
            for(j in header)
                printf "%s%s",((v=array[i][j])?v:"-"),(++c==length(header)?ORS:OFS)
        }
        json=""
    }
}' file.json

Вывод:

        EB0107  EB0110  EB0135  EB0147  EB0148  EB0187  EB0192
EB0016  0.0697  0.0822  0.1177  0.0867  0.1581  -       0.1372
EB0017  -       -       -       0.0847  0.1312  0.1364  0.093

Json расширение доступно здесь .

1 голос
/ 21 марта 2020

Хорошо, я думаю Я разработал то, что вы хотите, и этот бит jq (де-факто стандартный инструмент для работы с JSON в оболочке) должен сделайте это:

jq -r 'keys as $codes | 
       ((["Code"] + $codes),
        (to_entries | sort_by(.key)[] as $row |
         reduce $codes[] as $c ([$row.key]; . + [$row.value[$c]? // "-"]))) |
       @tsv' input_file.json

Для вашего примера ввода он выдает

Code    EB0016  EB0017
EB0016  -   -
EB0017  -   -

, потому что ваши родительские коды не отображаются как дочерние коды друг друга, но если они это сделали, вы ' d видеть соответствующие цифры вместо черточек.

Измените @tsv на @csv, чтобы получить вывод CSV, как говорит ваш вопрос (но не пример желаемого вывода). (Пожалуйста, пожалуйста, будьте последовательны в таких вещах и предоставьте примеры ввода и вывода, которые соответствуют друг другу. Это делает ответы на вопросы намного проще).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...