Ich habe die folgende JSON-Datei:
{
"data": [
{
"displayName": "First Name",
"rank": 1,
"value": "VALUE"
},
{
"displayName": "Last Name",
"rank": 2,
"value": "VALUE"
},
{
"displayName": "Position",
"rank": 3,
"value": "VALUE"
},
{
"displayName": "Company Name",
"rank": 4,
"value": "VALUE"
},
{
"displayName": "Country",
"rank": 5,
"value": "VALUE"
},
]
}
Ich hätte gerne eine CSV-Datei in diesem Format:
First Name, Last Name, Position, Company Name, Country
VALUE, VALUE, VALUE, VALUE, VALUE, VALUE
Ist dies nur mit möglich jq
? Ich habe keine Programmierkenntnisse.
Antworten:
jq hat einen Filter, @csv, um ein Array in einen CSV-String umzuwandeln. Dieser Filter berücksichtigt die meisten mit dem CSV-Format verbundenen Komplexitäten, beginnend mit Kommas, die in Felder eingebettet sind. (jq 1.5 hat einen ähnlichen Filter, @tsv, um Dateien mit durch Tabulatoren getrennten Werten zu generieren.)
Wenn die Überschriften und Werte garantiert alle frei von Kommas und doppelten Anführungszeichen sind, muss der @csv-Filter möglicherweise nicht verwendet werden. Andernfalls wäre es wahrscheinlich besser, es zu verwenden.
Wenn zum Beispiel der 'Firmenname' 'Smith, Smith und Smith' wäre und die anderen Werte wie unten gezeigt wären, würde das Aufrufen von jq mit der Option "-r" eine gültige CSV erzeugen:
quelle
Ich ziehe es vor, jede Aufzeichnung in meiner CSV als Zeile zu kennzeichnen.
quelle
.value|tostring
statt.value
im obigen Beispiel(.value|tostring)
jq -r
, um die Anführungszeichen zu streifenWenn Sie nur diese Datei angeben, können Sie Folgendes tun:
Der
.
Operator wählt ein Feld aus einem Objekt / Hash aus. Wir beginnen also mit.data
, das das Array mit den Daten darin zurückgibt. Wir ordnen das Array dann zweimal zu, indem wir zuerst den displayName und dann den Wert auswählen, sodass wir zwei Arrays erhalten, die nur die Werte dieser Schlüssel enthalten. Für jedes Array verbinden wir die Elemente mit "," und bilden zwei Zeilen. Das-r
Argument besagtjq
, dass die resultierenden Zeichenfolgen nicht in Anführungszeichen gesetzt werden sollen.Wenn Ihre eigentliche Datei länger ist (dh Einträge für mehr als eine Person enthält), benötigen Sie wahrscheinlich etwas Komplizierteres.
quelle
Ich habe es
jq
schwer gefunden , meinen Kopf herumzuwickeln. Hier ist etwas Rubin:Der rubinrote JSON-Parser machte vor der schließenden Klammer einen Strich durch das Komma.
quelle
Da hast du diesen getaggt
python
und nimmst denjson
Dateinamen anx.json
quelle
Obwohl ich das letzte Komma in Ihrer Beispieleingabe entfernen musste, damit es funktioniert, weil ich mich
jq
beschwerte, ein anderes Array-Element zu erwarten:...hast mich...
So funktioniert es auf den Punkt gebracht:
[]
Indexfeld und der.dot
Notation zur dritten Ebene der Datenobjekte durchgegangen..[][].displayName
.[.[][].displayName], [.[][].value]
join(", ")
Funktion weitergeleitet, die als separate Entitäten verbunden werden soll.In Wahrheit
[.field]
ist dies nur eine andere Möglichkeit,map(.field)
aber dies ist insofern etwas spezifischer, als es die Tiefenebene zum Abrufen der gewünschten Daten angibt.quelle