Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Batch omzetten van info uit .json bestanden  (gelezen 777 keer)

Offline Basic-NL

  • Lid
Batch omzetten van info uit .json bestanden
« Gepost op: 2023/01/09, 15:08:46 »
Hoi allemaal,

Ik heb een vraag over batch omzetten van info uit .json bestanden.

Ik heb een groot aantal .json bestanden die elk veel info over een foto bevatten.
Het enige wat ik hieruit wil halen is de regels met bestandstitel en beschrijving.

De regels in de .json waar het om gaat:
"id": "0123456789",
"name": "00001.jpg",
(de werkelijke bestandsnaam van de foto: 00001jpg_0123456789_o.jpg)
"description": "Foto 1\nDit is de beschrijving van foto 1"


Het uiteindelijke .txt bestand moet er zo uit komen te zien:
00001jpg_0123456789_o.jpg,Foto 1 - Dit is de beschrijving van foto 1
00002jpg_9876543210_o.jpg,Foto 2 - Dit is de beschrijving van foto 2
(enz.)

Wie kan mij vertellen hoe ik dit kan doen in Ubuntu?
Ik heb een voorkeur voor een simpel terminal commando, maar als het via GUI kan: ook prima.
Ik installeer het liefst geen software uit vage bronnen/PPA.

Vriendelijke groet, Basic-NL
« Laatst bewerkt op: 2023/01/09, 15:13:09 door Basic-NL »
100% Linux sinds 07-2005, Nu: (PC) Xubuntu 22.04 LTS (Phone) Ubuntu Touch

Offline bart85

  • Lid
Je leert maar mooi over weg gaan met de commandline. Geen grafische toepassingen voor systeembeheer.
You can never make a system 100% secure unless you unplug the machine from all networks, turn it off, lock it in a safe, smother it in concrete and never use it.

Offline Basic-NL

  • Lid
Re: Batch omzetten van info uit .json bestanden
« Reactie #2 Gepost op: 2023/01/09, 16:28:56 »
Hoi bart85,

Bedankt voor je reactie, fijn te horen dat wat ik wil ook mogelijk is! Ik kom er alleen niet uit met de links. Ik begrijp dat ik bash of python kan gebruiken,
alleen wat moet ik dan invoeren in de terminal? Kun je me hierbij helpen?
Voor de duidelijkheid: ik heb dus meerdere .json files waar ik gegevens uit wil halen die op een specifieke manier moeten worden gepresenteerd in 1 nieuw .txt.
Omdat het nogal veel .json zijn, zou ik deze bewerking graag in batch doen. Uiteraard kan alles handmatig, maar liever niet.

Groet, Basic-NL
« Laatst bewerkt op: 2023/01/09, 16:30:56 door Basic-NL »
100% Linux sinds 07-2005, Nu: (PC) Xubuntu 22.04 LTS (Phone) Ubuntu Touch

Re: Batch omzetten van info uit .json bestanden
« Reactie #3 Gepost op: 2023/01/09, 21:09:33 »
Je kunt het commando jq hiervoor wel gebruiken (zoals in de post van bart1985 staat).

Om je te helpen zou een voorbeeld van de hele JSON-structuur (1 keer het object dat steeds herhaald wordt, hoef niet alles te zien) wel handig zijn.

Maar stel ik een bestand test.json heb dat er als volgt uitziet:
[{
    "id": "0123456789",
    "name": "00001.jpg",   
    "description": "Foto 1\nDit is de beschrijving van foto 1"
},
{
    "id": "0123456790",
    "name": "00002.jpg",   
    "description": "Foto 2\nDit is de beschrijving van foto 2"
}]

Dan zou je er het volgende van kunnen maken:
cat test.json | jq '.[] | (.id) + "_" + (.name) + "," + (.description)' | sed 's/\\n/ - /g' | sed 's/"//g' > uiteindelijk.txt
De seds zijn om \n te vervangen door " - " en om de quotjes weg te halen uit de uitvoer van jq. Daar is ook een optie voor maar dan worden de newlines letterlijk geprint en komt de omschrijving in meerdere regels.

Heb je jq nog niet geinstalleerd kan dat simpel:
sudo apt install jq
Met Python zou het ook kunnen in 1 commando, alleen nog wat meer onleesbaar:
cat test.json | python3 -c "import json,sys;obj=json.load(sys.stdin);[print(x['id'] + '_' + x['name'] + ',' + x['description'].replace('\n',' - ')) for x in obj]" > uiteindelijk.txt

Offline Basic-NL

  • Lid
Re: Batch omzetten van info uit .json bestanden
« Reactie #4 Gepost op: 2023/01/10, 09:15:53 »
Hoi erik1984,

Super bedankt dat je me wilt helpen hiermee!

Voorbeeld .json 1:
{
"id": "0123456789",
"name": "00001.jpg",
"description": "Woord1\nWoord2\nWoord3\nWoord4",
"count_views": "0",
"count_faves": "0",
"count_comments": "0",
"date_taken": "0000-00-00 00:00:00",
"count_tags": "0",
"count_notes": "0",
"date_imported": "0000-00-00 00:00:00",
"photopage": "[website adres]",
"original": "[directe fotolink]",
"license": "All Rights Reserved",
"exif": {
"JFIF:XResolution": {
"full": "JFIF:XResolution",
"label": "X-Resolution",
"value": "72 dpi",
"raw_value": "72"
},
"JFIF:YResolution": {
"full": "JFIF:YResolution",
"label": "Y-Resolution",
"value": "72 dpi",
"raw_value": "72"
}
},
"groups": [

],
"albums": [

],
"tags": [
{
"tag": "[tag]",
"user": "[website adres]",
"date_create": "0000-00-00 00:00:00"
},
{
"tag": "[tag]",
"user": "[website adres]",
"date_create": "0000-00-00 00:00:00"
},
{
"tag": "[tag]",
"user": "[website adres]",
"date_create": "0000-00-00 00:00:00"
}
],
"people": [

],
"notes": [

],
"privacy": "friend & family",
"comment_permissions": "only you",
"tagging_permissions": "only you",
"safety": "safe",
"comments": [

]
}

Voorbeeld .json 2:
{
"id": "987654321",
"name": "00002.jpg",
"description": "Woord1 Woord2\nWoord3 Woord4",
"count_views": "0",
"count_faves": "0",
"count_comments": "0",
"date_taken": "0000-00-00 00:00:00",
"count_tags": "0",
"count_notes": "0",
"date_imported": "0000-00-00 00:00:00",
"photopage": "[website adres]",
"original": "[directe fotolink]",
"license": "All Rights Reserved",
"exif": {
"JFIF:XResolution": {
"full": "JFIF:XResolution",
"label": "X-Resolution",
"value": "72 dpi",
"raw_value": "72"
},
"JFIF:YResolution": {
"full": "JFIF:YResolution",
"label": "Y-Resolution",
"value": "72 dpi",
"raw_value": "72"
}
},
"groups": [

],
"albums": [

],
"tags": [
{
"tag": "[tag]",
"user": "[website adres]",
"date_create": "0000-00-00 00:00:00"
},
{
"tag": "[tag]",
"user": "[website adres]",
"date_create": "0000-00-00 00:00:00"
},
{
"tag": "[tag]",
"user": "[website adres]",
"date_create": "0000-00-00 00:00:00"
}
],
"people": [

],
"notes": [

],
"privacy": "friend & family",
"comment_permissions": "only you",
"tagging_permissions": "only you",
"safety": "safe",
"comments": [

]
}

En zo heb ik dus nog heel veel .json die uiteindelijk allemaal elk 1 regel moeten worden in hetzelfde .txt document.

00001jpg_0123456789_o.jpg,Foto 1 - Dit is de beschrijving van foto 1
00002jpg_9876543210_o.jpg,Foto 2 - Dit is de beschrijving van foto 2
(enz.)
100% Linux sinds 07-2005, Nu: (PC) Xubuntu 22.04 LTS (Phone) Ubuntu Touch

Re: Batch omzetten van info uit .json bestanden
« Reactie #5 Gepost op: 2023/01/10, 20:21:51 »
Is het voor elke foto een los .json-bestand of staan deze JSON-objecten samen (in een array) in 1 groot bestand? Dat is even handig om te weten. In mijn voorbeeld ga ik uit van een array maar anders moet het commando aangepast worden om eerst alle .json-bestanden op te sommen en voor elk bestand jq of Python te draaien.

Offline Basic-NL

  • Lid
Re: Batch omzetten van info uit .json bestanden
« Reactie #6 Gepost op: 2023/01/10, 21:31:51 »
Hoi erik1984,

Het gaat echt om meerdere losse .json bestanden (1 per foto), dus geen verzamelbestand of array.

Het eindbestand (output) moet wel 1 .txt worden met voor elke foto 1 regel info.
100% Linux sinds 07-2005, Nu: (PC) Xubuntu 22.04 LTS (Phone) Ubuntu Touch

Re: Batch omzetten van info uit .json bestanden
« Reactie #7 Gepost op: 2023/01/10, 23:12:43 »
Met het volgende gedrocht (kleine aanpassing aan jq-aanroep en een loop) kun je alle .json-bestanden in de huidige map afgaan:
for i in *.json; do cat $i | jq '. | (.id) + "_" + (.name) + "," + (.description)' | sed 's/\\n/ - /g' | sed 's/"//g' >> uiteindelijk.txt; done

Offline Basic-NL

  • Lid
Re: Batch omzetten van info uit .json bestanden
« Reactie #8 Gepost op: 2023/01/11, 16:45:37 »
Hoi erik1984,

Het eerste fotoalbum is inmiddels weer voorzien van beschrijvingen!
Ik zal voor sommige albums (met iets andere bestandnaamopbouw) nog wat aanpassingen moeten doen in het commando, maar dat lukt wel.
Hartelijk dank voor de hulp, met de hoeveelheid bestanden die ik heb scheelt dit echt een hele hoop werk!

Groet, Basic-NL
100% Linux sinds 07-2005, Nu: (PC) Xubuntu 22.04 LTS (Phone) Ubuntu Touch