2017-11-21 1 views
0

Ich versuche, ein JSON mit verschachtelten Objekten und Arrays in eine CSV-Datei zu konvertieren. Die Struktur ist:Konvertieren noch ein JSON zu CSV mit jq

{ 
    "Date": { 
    "Value": "2017-11-17T00:00:00" 
    }, 
    "ThisOne": false 
} 
{ 
    "Date": { 
    "Value": "2017-11-17T00:00:00" 
    }, 
    "ThisOne": true, 
    "Groups": { 
    "10": { 
     "Id": "10", 
     "SomeUnnecessaryObject": true 
    }, 
    "11": { 
     "Id": "11", 
     "RequiredObject": { 
     "SEeminGlyRANdOMStRiNG": { 
      "Value1": "2", 
      "Value2": "3", 
      "Units": [ 
      "1", 
      "5" 
      ] 
     } 
     } 
    }, 
    "12": { 
     "Id": "12", 
     "RequiredObject": { 
     "AnOthEr321": { 
      "Value1": "1", 
      "Value2": "9", 
      "Units": [ 
      "2" 
      ] 
     } 
     } 
    } 
    } 
} 

(Hoffnung Ich habe die Klammern rechts) und ich versuche, es zu konvertieren csv:

date|value1|value2|group|unit1|unit2|unit3|unit4|unit5 
2017-11-17T00:00:00|2|3|11|1|0|0|0|1 
2017-11-17T00:00:00|1|9|12|0|1|0|0|0 

Die Gruppen laufen von 10 bis 99 und Einheiten von 1 bis 5 Die SEeminGlyRANdOMStRiNG ist eine scheinbar zufällige Zeichenfolge. Die Objekte, die ich haben möchte, haben RequiredObject, aber es gibt Top-Level-Objekte, die es nicht haben. Ich habe Objekte mit select(.ThisOne==true) gekürzt, weil ich nicht verstehe, wie man von .Group ... RequiredObject ... Value1 mit sich ändernden Werten im Pfad referenziert. Möglicherweise gibt es Objekte auf oberster Ebene, die ThisOne==true haben, aber keine RequiredObject s.

Antwort

2

Vorausgesetzt, dass Sie den gleichen Zustand auf den Einheits Spalten as in your earlier question sollen die folgenden Filter die gewünschte Ausgabe erzeugen:

["\(1+range(5))"] as $units 
| ["date", "value1", "value2", "group", "unit\($units[])"] 
, (
     inputs 
    | .Date.Value as $date 
    | .Groups[]? 
    | .Id as $group 
    | .RequiredObject // {} 
    | keys[] as $k 
    | .[$k] 
    | .Value1 as $value1 
    | .Value2 as $value2 
    | [ $date, $value1, $value2, $group, (.Units[$units[]|[.]] | if .!=[] then "1" else "0" end) ] 
) 
| join("|") 

Probe Run (annehmen Filter in filter.jq und Daten in data.json)

$ jq -Mnr -f filter.jq data.json 
date|value1|value2|group|unit1|unit2|unit3|unit4|unit5 
2017-11-17T00:00:00|2|3|11|1|0|0|0|1 
2017-11-17T00:00:00|1|9|12|0|1|0|0|0 

Try it online!

+0

BTW, was ist: '.RequiredObject // {}'? –

+1

'expr // value' bedeutet Rückgabewert, wenn' expr' false oder null ist. Siehe [Alternativer Operator //] (http://stedolan.github.io/jq/manual/#Alternativeoperator:://) – jq170727

+1

Auch da es keine Notwendigkeit für die scheinbar zufälligen String-Schlüssel gibt, könnte dies etwas mehr vereinfacht werden. Anstelle von '| .RequiredObject // {} | Schlüssel [] als $ k | . [$ k] 'Sie könnten einfach' .RequiredObject [] verwenden? 'lassen Sie das ['? '] (https://stedolan.github.io/jq/manual/#. []?) mit fehlenden RequiredObjects umgehen. – jq170727