Estrarre dati da un file json

Come e estrarre dati da un file json usando ogr2ogr.

A cura di Totò Fiandaca  | issue #237 | guida/e Andrea Borruso


Caso d’uso

Dato un FileGDB DBGT_10K_22_V01.gdb (pesa circa 5 GB con oltre 300 tabelle, relazioni e domini), che contiene semplici tabelle e tabelle con attributi geometrici e domini di campo. Estrarre i domini di campo e creare una lista dei domini associati ai vari layer.

Soluzione

 <dbgt10k_fc_domain.json jq '.layers[]|{name:.name,fields:.fields[].domainName}' | mlr --j2c unsparsify then filter '!is_null($fields)' then sort -f name,fields then nest --ivar "," -f fields

output:

dove:

  • jq, estrae prima il nodo layers, e poi dall’output costruisco una nuova struttura composta dal nome del layer e dal nodo fields contenuto nei layer;
  • Miller trasforma il precedente output JSON in CSV, e filtro soltanto i record per i quali c'è un field associato, ordina per name e fields (campi creati) e infine implode i nomi dei field, li unisce, separandoli tramite , e raggruppandoli per nome di layer sorgente.

una riga per ogni dominio:

<dbgt10k_fc_domain.json jq '.layers[]|{name:.name,fields:.fields[].domainName}' | mlr --j2c unsparsify then filter '!is_null($fields)' then sort -f name,fields

script bash:

#!/bin/bash

set -x
set -e
set -u
set -o pipefail

folder="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# dbgt10k_fc_domain.json ottenuto: 'ogrinfo -json DBGT_10K_22_V01.gdb'
# lista_demain.csv ottenuto da: 'ogrinfo -json DBGT_10K_22_V01.gdb | jq -r '.domains|keys[]''

# crea cartella per i dati, se non esiste
mkdir -p "$folder"/data

# rimuovi i file csv, se esistono
find "$folder"/data -type f -name '*.csv' -delete

while IFS="" read -r domain; do
  jq -r '.domains.'"$domain"'.codedValues' dbgt10k_fc_domain.json |
  mlr --j2c reshape -r '.' -o k,v >"$folder"/data/"$domain".csv
done <lista_demain.csv

Dati

Riferimenti utili

Ultima modifica 17/02/2023: update tags (c76599d)