Eterogeneità dei record¶
Per Miller il modo nativo di "pensare" ai dati è per record eterogenei: ogni record non deve necessariamente avere lo stesso numero di campi degli altri.
I record non hanno lo stesso numero di campi
nome=andy,dataNascita=1973-05-08,altezza=176,peso=86.5,comuneNascita=Roma
nome=chiara,dataNascita=1993-12-13,altezza=162,peso=58.3,comuneNascita=Milano
nome=guido,altezza=196,peso=90.4,comuneNascita=Roma
nome=sara,dataNascita=2000-02-22,altezza=166,peso=70.4,comuneNascita=Roma
nome=giulia,dataNascita=1997-08-13,altezza=169,peso=68.3
Terminologia¶
Esistono tre tipi di eterogeneità: ragged
, irregular
e sparse
.
Dati rettangolari¶
Qui un esempio di dati "rettangolari", in formato CSV
: 3 i campi previsti, e ogni record ha valorizzato 3 campi.
Dati rettangolari, ma con celle vuote¶
Questo è un file che non ha record eterogenei, ma ha alcune celle vuote (per il campo b
a riga 2 e per il campo a
a riga 3).
In Miller è possibile usare il verbo fill-empty
, per attribuirgli un valore (ad esempio NA
). La gestione dei valori sconosciuti o nulli è tra la buone pratiche della pubblicazione di dati in formato CSV.
Il verbo fill-empty
richiede Miller >= 6.0
Ragged¶
Questo è il caso di eterogeneità, dovuta a errori di struttura del file. Come questo di sotto.
Se si prova semplicemente a stamparlo a schermo, Miller restituisce un errore:
mlr --csv cat ./eterogeneita_ragged.csv
Questi gli errori del file, che ha un'intestazione composta da 3 campi:
- nella riga 2, ci sono 2 campi e non 3;
- nella riga 4, ci sono 4 campi e non 3.
Miller è in grado di gestire anche questa eterogeneità, che deriva da errori, utilizzando il flag --allow-ragged-csv-input
:
Per il primo errore è stata aggiunta una cella vuota; per il secondo è stato aggiunto un campo a cui è stato assegnato un'etichetta numerica - 4
- corrispondente al suo ordine nella lista dei campi.
Irregular¶
Un altro tipo di eterogeneità è legata a campi ordinati diversamente per ogni riga:
{"a": 1, "b": 2, "c": 3}
{"c": 6, "a": 4, "b": 5}
{"b": 8, "c": 9, "a": 7}
Se fosse necessario uniformare l'ordine si possono usare i verbi regularize
o sort-within-records
.
Il verbo regularize
riordina le righe nello stesso ordine della prima (qualunque sia l'ordine); il verbo sort-in-records
usa semplicemente l'ordine alfabetico.
Sparse¶
In ultimo c'è l'eterogeneità più frequente, legata a record che non sono composti tutti dagli stessi campi. Come ad esempio il JSON
sottostante.
{
"host": "xy01.east",
"status": "running",
"volume": "/dev/sda1"
}
{
"host": "xy92.west",
"status": "running"
}
{
"purpose": "failover",
"host": "xy55.east",
"volume": "/dev/sda1",
"reimaged": true
}
Si può utilizzare il verbo unsparsify
per fare in modo che tutti i record abbiano gli stessi campi.
mlr --json unsparsify ./eterogeneita_sparse.json