2016-09-15 2 views
0

Ich habe eine JSON-Datei 'OpenEnded_mscoco_val2014.json'.Die JSON-Datei enthält 121.512 Fragen.
Hier einige Beispiel:Convert JSON mit jq basierend auf bestimmten Einschränkungen

"questions": [ 
{ 
    "question": "What is the table made of?", 
    "image_id": 350623, 
    "question_id": 3506232 
}, 
{ 
    "question": "Is the food napping on the table?", 
    "image_id": 350623, 
    "question_id": 3506230 
}, 
{ 
    "question": "What has been upcycled to make lights?", 
    "image_id": 350623, 
    "question_id": 3506231 
}, 
{ 
    "question": "Is this an Spanish town?", 
    "image_id": 8647, 
    "question_id": 86472 
} 

]

I verwendet jq -r '.questions | [map(.question), map(.image_id), map(.question_id)] | @csv' OpenEnded_mscoco_val2014_questions.json >> temp.csv json in csv zu konvertieren.
Aber hier Ausgabe in CSV ist Frage gefolgt von image_id was ist, was oben Code tut.
Die erwartete Ausgabe lautet:

"What is table made of",350623,3506232 
"Is the food napping on the table?",350623,3506230 

Auch ist es möglich, nur die Ergebnisse mit image_id <= 10000 und group questions having same image_id zu filtern? z.B. 1,2,3 Ergebnis von JSON kann kombiniert werden, um 3 Fragen zu haben, 1 image_id, 3 question_id.

EDIT: Das erste Problem wird durch possible duplicate question gelöst. Ich würde gerne wissen, ob es möglich ist, Vergleichsoperator auf der Befehlszeile in jq zum Konvertieren von JSON-Datei aufrufen. In diesem Fall erhalten Sie alle Felder von json, wenn nur image_id <= 10000.

+0

Nicht ganz sicher, was Ihre erste Frage hier ist? – JosephGarrone

+0

Mögliches Duplikat von [Konvertieren von einfachem JSON in CSV mithilfe von jq?] (Http://stackoverflow.com/questions/32960857/how-to-convert-arbirtrary-simple-json-to-csv-using-jq) –

+0

Ich möchte Ausgabe mit image_id mit Wert <= 10000 mit jq filtern, da die Datei zu groß ist, so dass die Verwendung von json_load() und das Vergleichen viel Speicher benötigen. – SupposeXYZ

Antwort

1

1) Da Sie Ihre Eingabe (in geeigneter Weise ausgearbeitet es gültig JSON) zu machen, die folgende Abfrage generiert die CSV-Ausgabe wie folgt:

$ jq -r '.questions[] | [.question, .image_id, .question_id] | @csv' 

"What is the table made of?",350623,3506232 
"Is the food napping on the table?",350623,3506230 
"What has been upcycled to make lights?",350623,3506231 
"Is this an Spanish town?",8647,86472 

Der Schlüssel ist hier zu erinnern ist, dass @csv eine flache Anordnung erfordert , aber wie bei allen jq-Filtern können Sie einen Stream streamen.

2) .image_id <= 10000 mit dem Kriterium zu filtern, dazwischenstellen einfach die entsprechenden select/1 Filter:

.questions[] 
| select(.image_id <= 10000) 
| [.question, .image_id, .question_id] 
| @csv 

3) durch image_id, Verwendung sort_by (.image_id)

.questions 
| sort_by(.image_id) 
|.[] 
| [.question, .image_id, .question_id] 
| @csv 

4) zu sortieren Gruppe von .image_id würden Sie die Ausgabe der folgenden Pipeline in Ihre eigene Pipeline leiten:

.questions | group_by(.image_id) 

Sie müssen jedoch genau entscheiden, wie Sie die gruppierten Objekte kombinieren möchten.

+0

Für die zweite Antwort ist es möglich, .question | select (.image_id <= 10000) | [.question, .image_id, .question_id] | zu schreiben @csv, so dass es die eingeschränkte Ausgabe zurückgibt? – SupposeXYZ

+0

In (2) gibt der angegebene Filter den eingeschränkten Ausgang aus! Hast du es versucht? – peak

+0

Hey @peak, danke, es hat alles geklappt !! Ist es möglich, bestimmte Fragetypen aus JSON-Daten zu extrahieren.Wie ich will nur Frage mit "Wie", "Was ist", etc..using using json.load(). – SupposeXYZ

0

Mit der -r Option, die folgenden Filter

.questions[] | [ .[] ] | @csv 

produzieren

"What is the table made of?",350623,3506232 
"Is the food napping on the table?",350623,3506230 
"What has been upcycled to make lights?",350623,3506231 
"Is this an Spanish town?",8647,86472 

die Daten zu filtern, verwenden Sie wählen. Z.B. mit der Option -r folgenden Filter

.questions[] | select(.image_id <= 10000) | [ .[] ] | @csv 

erzeugt die Teilmenge

"Is this an Spanish town?",8647,86472 

zur Gruppe der Daten group_by verwenden.Der folgende Filter

.questions 
    | group_by(.image_id)[] 
    | [ .[] | [ .[] ] | @csv ] 

produziert Daten

[ 
    "\"Is this an Spanish town?\",8647,86472" 
] 
[ 
    "\"What is the table made of?\",350623,3506232", 
    "\"Is the food napping on the table?\",350623,3506230", 
    "\"What has been upcycled to make lights?\",350623,3506231" 
] 

gruppiert Dies ist in dieser Form nicht sehr nützlich und ist wahrscheinlich nicht genau das, was Sie wollen, aber es zeigt den grundlegenden Ansatz.