Как выбрать значение из CSV, содержащего JSON в виде столбца

У меня есть странный CSV-файл, в котором один столбец представляет собой данные JSON довольно большого размера, а другой — имя. Для ясности показано правильное форматирование JSON, но сам файл плоский, без символов новой строки.

      name, 
{
"field1":
   {"name":"foo",
   "email":"test@gmail.com"},
"field2":{
     "subfield":{
          "subfield2":{
               "active":1,
               "passive":11,
               "running":111
                       }
                  }
           }
}

Ввод без красивого форматирования…

      name,{"field1":{"name":"foo","email":"test@gmail.com"},"field2":{"subfield":{"subfield2":{"active":1,"passive":11,"running":111}}}}

Я пытаюсь получить имя и все уникальные значения для подполя 2 в выходные данные (в идеале CSV).

      name, 
active passive running

Проблема в том, что количество полей не является постоянным, как и имена подполей. Я пробовал использовать jq, Miller и sed/awk, но безуспешно, поскольку они сочетают в себе огромный объект JSON и данные CSV.

3 ответа

Если вы запустите образец ввода

      <input.txt sed '/name,/d' | jq -cr '.field2.subfield.subfield2 | keys[]' | paste -s -d ' ' | mlr --csv --implicit-csv-header then label name

Вы получаете

      name
active passive running

Пример вывода, который вы пишете, неверен, потому что, если это CSV с одним полем, у вас нет,после имени других полей нет

      name, 
active passive running

Но я наверное не понял, чего ты хочешь

Вы можете использовать свой любимый переводчик CSV-TSV, чтобы преобразовать CSV в TSV, а затем запустить его через jq следующим образом:

      jq -rR '
  split("\t") 
  | [[.0], 
     ( .[1]|fromjson|.field2.subfield.subfield2 | keys_unsorted|join(" "))] 
  | @csv'

Я провел некоторое время с sed и получил то, что мне нужно, используя следующее:

      sed -e 's/.*subfield2\(.*\)}}}.*/\1/' input.txt
Другие вопросы по тегам