Closed UO-TransizioneDigitaleComunePalermo closed 2 years ago
Nel documento ci sono schede per link agli opendata delle elezioni comunali del 2017
grazie @gbvitrano era quello che volevo conoscere
Sorry ma non è stato spiegato il come :(
Sorry ma non è stato spiegato il come :(
Usando Visidata :-)
da terminale vd "https://dati.gov.it/opendata/api/3/action/package_search?facet.field=%5B%22holder_name%22%5D&facet.limit=-1&fq=holder_name:%22Comune%20di%20Palermo%22"
il file è json e può essere facilmente convertito in csv con servizio online :-)
@UO-TransizioneDigitaleComunePalermo ecco il file csv output.csv
Caro @UO-TransizioneDigitaleComunePalermo alias @cirospat il formato JSON, diciamo che è il formato dati di oggi, output standard di molte API. Quella è una risposta delle API di CKAN.
Un JSON non è quasi mai una tabella di x righe per n colonne, non è mai così poco nidificato come questo file (che è una tabella 2x2):
[
{
"nome": "ciro",
"altezza": "media"
},
{
"nome": "andrea",
"altezza": "poco più che media"
}
]
È quasi sempre una specie di tabella che all'interno ne contiene tante altre. Lo vedi nella gif di sotto, in cui hai:
Allora l'operazione che ci sarebbe da fare, per renderlo leggibile come vuoi tu, è il così detto flattening, ovvero l'estrazione delle tabelle che lo compongono, tenendo una colonna chiave che possa metterle in relazione.
Ci vuole un tool per interpretare il formato. Ce ne sono tanti e chi sviluppa codice, può farlo in qualsiasi linguaggio di scripting.
Lo strumento a riga di comando più famoso è jq, che ha il suo modo (abbastanza tipico) di sfogliare la gerarchia.
Le risorse ad esempio, sono figlie di results
, che è figlio di result
. La query per arrivare a resources
si scrive così .result.results.resources
, sfogliando l'albero gerarchico da sinistra verso destra.
Ma è in realtà è poco più complicato, perché sia results
che resources
contengono vari elementi al loro interno, sono degli array e allora ci vogliono le quadre .result.results[].resources[]
E con questa query estrai le risorse https://jqplay.org/s/Ll4rEyaBHY
E se ti interessano soltanto l'URL e il formato, la query si complica un po' .result.results[].resources[]|{URL:.download_url,formato:.format}
.
Ma torniamo a estrarre una delle tabelle, le risorse. Io in questi casi, uso la coppia jq
più miller
:
<input.json jq '.result.results[].resources[]' | mlr --j2c unsparsify >output.csv
ti dà un CSV come quello visualizzato qui.
cache_last_updated | package_id | id | size | download_url | state | hash | description | format | mimetype_inner | url_type | revision_id | mimetype | cache_url | name | license | created | url | uri | last_modified | license_type | position | access_url | resource_type |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
null | 90966e9d-cb06-454d-bbcb-2f0d396f2cca | 4057e7af-1b49-4275-b559-6b19700124ec | null | http://circoscrizioni2017.comune.palermo.it/SEZ_3_999008_L21.xml | active | Distribuzione XML del dataset ELEZIONI AMMINISTRATIVE 2017 - VIII° CIRCOSCRIZIONE - VOTI AI CONSIGLIERI DI CIRC PER SEZ (LISTA 21) | XML | null | null | a28b38d3-7d7d-49ef-81e0-65573c1bfff8 | null | null | Distribuzione XML del dataset ELEZIONI AMMINISTRATIVE 2017 - VIII° CIRCOSCRIZIONE - VOTI AI CONSIGLIERI DI CIRC PER SEZ (LISTA 21) | https://creativecommons.org/licenses/by/4.0/ | 2021-02-19T18:30:36.883765 | http://circoscrizioni2017.comune.palermo.it/SEZ_3_999008_L21.xml | http://circoscrizioni2017.comune.palermo.it/SEZ_3_999008_L21.xml | null | https://w3id.org/italia/controlled-vocabulary/licences/A21_CCBY40 | 0 | https://opendata.comune.palermo.it/opendata-dataset.php?dataset=840 | null | |
null | 00419f01-0fc8-407d-8e5d-73ef2fa3bbdc | c02a5768-4b08-4a0c-90de-edd50128a391 | null | http://circoscrizioni2017.comune.palermo.it/SEZ_3_999005_L28.xml | active | Distribuzione XML del dataset ELEZIONI AMMINISTRATIVE 2017 - V° CIRCOSCRIZIONE - VOTI AI CONSIGLIERI DI CIRC PER SEZ (LISTA 28) | XML | null | null | e8d86c66-9243-4e07-aaec-bbe546fbf7ee | null | null | Distribuzione XML del dataset ELEZIONI AMMINISTRATIVE 2017 - V° CIRCOSCRIZIONE - VOTI AI CONSIGLIERI DI CIRC PER SEZ (LISTA 28) | https://creativecommons.org/licenses/by/4.0/ | 2021-02-19T18:35:10.677279 | http://circoscrizioni2017.comune.palermo.it/SEZ_3_999005_L28.xml | http://circoscrizioni2017.comune.palermo.it/SEZ_3_999005_L28.xml | null | https://w3id.org/italia/controlled-vocabulary/licences/A21_CCBY40 | 0 | https://opendata.comune.palermo.it/opendata-dataset.php?dataset=760 | null | |
null | 0194c452-fdca-40d1-a5ba-b93ee045f024 | ecb8bff6-ed05-44e1-8296-39c1fe8fd7d1 | null | http://consulta2018.comune.palermo.it/VotiCandEuroSez.xml | active | Distribuzione XML del dataset ELEZIONI CONSULTA DELLE CULTURE 2018 - DATI RELATIVI VOTI CANDIDATI PER SEZIONE | XML | null | null | 22d7643c-dd4d-4786-8648-81196963b6a2 | null | null | Distribuzione XML del dataset ELEZIONI CONSULTA DELLE CULTURE 2018 - DATI RELATIVI VOTI CANDIDATI PER SEZIONE | https://creativecommons.org/licenses/by/4.0/ | 2021-02-19T18:33:20.380438 | http://consulta2018.comune.palermo.it/VotiCandEuroSez.xml | http://consulta2018.comune.palermo.it/VotiCandEuroSez.xml | null | https://w3id.org/italia/controlled-vocabulary/licences/A21_CCBY40 | 0 | https://opendata.comune.palermo.it/opendata-dataset.php?dataset=1030 | null | |
null | 4177b9ea-81f4-4655-b12f-8f8af8dd172b | 5b28a0e6-e1bc-4c1b-9e97-05b44410b99f | null | http://circoscrizioni2017.comune.palermo.it/SEZ_3_999006_L21.xml | active | Distribuzione XML del dataset ELEZIONI AMMINISTRATIVE 2017 - VI° CIRCOSCRIZIONE - VOTI AI CONSIGLIERI DI CIRC PER SEZ (LISTA 21) | XML | null | null | 3583d6a4-b0b9-4a24-91ec-bc4997807ab9 | null | null | Distribuzione XML del dataset ELEZIONI AMMINISTRATIVE 2017 - VI° CIRCOSCRIZIONE - VOTI AI CONSIGLIERI DI CIRC PER SEZ (LISTA 21) | https://creativecommons.org/licenses/by/4.0/ | 2021-02-19T18:31:52.973775 | http://circoscrizioni2017.comune.palermo.it/SEZ_3_999006_L21.xml | http://circoscrizioni2017.comune.palermo.it/SEZ_3_999006_L21.xml | null | https://w3id.org/italia/controlled-vocabulary/licences/A21_CCBY40 | 0 | https://opendata.comune.palermo.it/opendata-dataset.php?dataset=798 | null | |
null | 5c470b79-651a-43ba-9d95-49d2009eb455 | f8239c5f-1f50-4774-a84d-e5bc7801e94a | null | http://circoscrizioni2017.comune.palermo.it/SEZ_3_999003_L2.xml | active | Distribuzione XML del dataset ELEZIONI AMMINISTRATIVE 2017 - III° CIRCOSCRIZIONE - VOTI AI CONSIGLIERI DI CIRC PER SEZ (LISTA 2) | XML | null | null | 78e355c4-489b-4630-a207-526d05cf6f8b | null | null | Distribuzione XML del dataset ELEZIONI AMMINISTRATIVE 2017 - III° CIRCOSCRIZIONE - VOTI AI CONSIGLIERI DI CIRC PER SEZ (LISTA 2) | https://creativecommons.org/licenses/by/4.0/ | 2021-02-19T18:28:06.262820 | http://circoscrizioni2017.comune.palermo.it/SEZ_3_999003_L2.xml | http://circoscrizioni2017.comune.palermo.it/SEZ_3_999003_L2.xml | null | https://w3id.org/italia/controlled-vocabulary/licences/A21_CCBY40 | 0 | https://opendata.comune.palermo.it/opendata-dataset.php?dataset=687 | null | |
null | 75f471b2-6184-41a6-8c9b-876f9283110c | bd04c078-73d9-4910-9a52-1d7cd107b375 | null | http://circoscrizioni2017.comune.palermo.it/SEZ_3_999002_L7.xml | active | Distribuzione XML del dataset ELEZIONI AMMINISTRATIVE 2017 - II° CIRCOSCRIZIONE - VOTI AI CONSIGLIERI DI CIRC PER SEZ (LISTA 7) | XML | null | null | f6b818c5-b55d-458e-a2cc-9a2abefeccc2 | null | null | Distribuzione XML del dataset ELEZIONI AMMINISTRATIVE 2017 - II° CIRCOSCRIZIONE - VOTI AI CONSIGLIERI DI CIRC PER SEZ (LISTA 7) | https://creativecommons.org/licenses/by/4.0/ | 2021-02-19T18:41:30.549975 | http://circoscrizioni2017.comune.palermo.it/SEZ_3_999002_L7.xml | http://circoscrizioni2017.comune.palermo.it/SEZ_3_999002_L7.xml | null | https://w3id.org/italia/controlled-vocabulary/licences/A21_CCBY40 | 0 | https://opendata.comune.palermo.it/opendata-dataset.php?dataset=659 | null | |
null | 540ac937-e395-45a6-b5b8-bc5cb438661c | 5ab4f07b-f4da-4e9a-b528-4cdc18eb9905 | null | https://opendata.comune.palermo.it/js/server/uploads/dataset/gtfs/_05102018083223.zip | active | Distribuzione ZIP del dataset AMAT PALERMO SPA - DATI DEL TRASPORTO PUBBLICO LOCALE 16-09-2018 31-12-2018 | ZIP | null | null | efa1d728-1919-4628-99b5-4a1f85cfb3ba | null | null | Distribuzione ZIP del dataset AMAT PALERMO SPA - DATI DEL TRASPORTO PUBBLICO LOCALE 16-09-2018 31-12-2018 | https://creativecommons.org/licenses/by/4.0/ | 2021-02-19T18:41:41.062713 | https://opendata.comune.palermo.it/js/server/uploads/dataset/gtfs/_05102018083223.zip | https://opendata.comune.palermo.it/js/server/uploads/dataset/gtfs/_05102018083223.zip | null | https://w3id.org/italia/controlled-vocabulary/licences/A21_CCBY40 | 0 | https://opendata.comune.palermo.it/opendata-dataset.php?dataset=1042 | null |
E se per ogni dataset volessi i tag? La query si complica, perché i tags e l'id del dataset sono separati e devi metterli insieme: .result.results|map_values(.tags[] + {id_dataset:.id})
Per averli in CSV di nuovo qualcosa come
<input.json jq '.result.results|map_values(.tags[] + {id_dataset:.id})' | mlr --j2c cat
vocabulary_id | state | display_name | id | name | id_dataset |
---|---|---|---|---|---|
null | active | amministrative-2017 | cdf9926a-23eb-454f-81ae-d2587c50f062 | amministrative-2017 | 90966e9d-cb06-454d-bbcb-2f0d396f2cca |
null | active | amministrative-2017 | cdf9926a-23eb-454f-81ae-d2587c50f062 | amministrative-2017 | 00419f01-0fc8-407d-8e5d-73ef2fa3bbdc |
null | active | consulta-culture | f7fc48ed-932d-4ebf-9d88-028d3267f6ce | consulta-culture | 0194c452-fdca-40d1-a5ba-b93ee045f024 |
null | active | amministrative-2017 | cdf9926a-23eb-454f-81ae-d2587c50f062 | amministrative-2017 | 4177b9ea-81f4-4655-b12f-8f8af8dd172b |
null | active | amministrative-2017 | cdf9926a-23eb-454f-81ae-d2587c50f062 | amministrative-2017 | 5c470b79-651a-43ba-9d95-49d2009eb455 |
null | active | amministrative-2017 | cdf9926a-23eb-454f-81ae-d2587c50f062 | amministrative-2017 | 75f471b2-6184-41a6-8c9b-876f9283110c |
null | active | amat | c78efeff-9ace-4da5-9ca1-0346da58146f | amat | 540ac937-e395-45a6-b5b8-bc5cb438661c |
null | active | amministrative-2017 | cdf9926a-23eb-454f-81ae-d2587c50f062 | amministrative-2017 | ac13d1b9-8752-4eef-8f6a-68be50d74593 |
null | active | 2014 | 0d7f2cc1-003f-4afd-847b-2755d133a09b | 2014 | 46b2a122-9cc9-446c-8051-5a9fca38b9fd |
null | active | 2017 | 60821792-fe44-4012-8c81-a04697650276 | 2017 | 42c490c7-d349-4b83-8f77-866e5e1f06ca |
L'output che ti ha inviato @gbvitrano non è di quelli che mi piacciono: è fatto da più di 1000 record, quando abbiamo 10 dataset e 10 risorse. Sono lì così tanti perché è come se fossero la moltiplicazione dei record di tutte le tabelle.
Farlo pulito è meglio, ma bisogna entrare un po' in questo mondo e impadronirsi degli strumenti e della teoria per interrogare e trasformare un JSON.
Sono stato lungo
caro @aborruso grazie del tempo che hai investito nel fornire una chiarissima ed esaustiva spiegazione al mio quesito. La tua risposta è molto didattica perchè spiega il "come fare". Devo ammettere che ad oggi non avrei una competenza adeguata ad ottenere un file di tipo tabellare da quel file output dell'API di CKAN. Ero interessato a conoscere i contenuti di quel file e ho chiesto il formato tabellare. E avete soddisfatto la mia esigenza. Grazie sempre di cuore per il tempo dedicato a spiegare cose che spesso per me sono ostiche a primo approccio.
Caro @UO-TransizioneDigitaleComunePalermo non sono sicuro che sei stato soddisfatto.
Le API danno un risultato paginato, di 10 in 10, mentre tu hai 1186 dataset.
{
"count": 1186,
"sort": "score desc, metadata_modified desc",
"facets": {
"holder_name": {
"Comune di Palermo": 1186
}
}
}
La tua era una curiosità o vorresti avere un riscontro su tutti i 1186 dataset? Cosa vorresti vedere di ognuno?
caro @aborruso grazie del tuo approfondimento, a questo punto credo che è necessario spiegarmi meglio.
Io parto da questo file: https://dati.gov.it/opendata/api/3/action/package_search?facet.field=%5B%22holder_name%22%5D&facet.limit=-1&fq=holder_name:%22Comune%20di%20Palermo%22
Se lo leggo così: non ci capisco nulla.
La mia domanda è:
che dati ci sono dentro questo file?
Siccome io sono scecco, allora il formato tabellare mi permette di capire che dati ci sono in un dataset.
Posso anche capire che dati ci sono in un formato XML
e in un formato JSON
, ma in ambedue i formati, per capire, devo avere un dato per ogni singola riga altrimenti non ci capisco molto.
Spero di essermi spigato più chiaramente ora. Forse ... :)
@UO-TransizioneDigitaleComunePalermo forse ti basterebbe un jsonparser (cercalo nel market delle estensioni del tuo browser).
Spero di essermi spigato più chiaramente ora. Forse ... :)
Non avevo capito nulla e ti ho dato una risposta inutile 😢
In questo caso ti basta un'estensione per browser. Io in chrome uso questa e vedo quella pagina come sotto.
Anche i devtoys tra le mille cose, hanno un "parser" di json che li rende leggibili
ti ho dato una risposta inutile
nulla è inutile,
grazie per il tempo dedicatoci :-)
infatti è come dice @pigreco nulla è inutile quando dietro c'è una spiegazione
grazie per il tempo, credo che con l'estensione per Chrome soddisfo il mio bisogno di conoscere che dati ci sono dentro quel file
salve dal validatore di dataset dell'AGID ho questo file:
https://dati.gov.it/opendata/api/3/action/package_search?facet.field=[%22holder_name%22]&facet.limit=-1&fq=holder_name:%22Comune%20di%20Palermo%22
Vorrei ottenere un formato dati strutturato, anche tabellare se possibile, per capire che dati sono contenuti. Come si fa? Grazie