Gestione formati¶
Il formato nativo di Miller è il DKVP
("Delimited Key-Value Pairs"), ovvero delle coppie chiave-valore, separate da virgola (la ,
è il separatore di default).
A seguire un esempio.
Esempio del formato nativo. Notare che 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
Spesso si pensa ai dati come "rettangolari": se sono previsti 10 campi, ogni record sarà composto da 10 valori.
Ma non è sempre così, come nel caso del formato JSON
o appunto di quello nativo di Miller, in cui ogni record non ha necessariamente lo stesso numero di campi degli altri.
Miller di default gestisce quindi l'eterogeneità dei record.
Conversione di formato¶
Miller legge e scrive diversi formati di testo strutturato. Per impostare quello di input e di output è necessario utilizzare uno dei flag dedicati e una delle modalità per farlo.
Ad esempio per convertire un file da CSV
a TSV
, si può usare questo comando:
Nel dettaglio:
--icsv
per impostare il formato di input;--ocsv
per impostare il formato di output;cat
è uno dei verbi di Miller, quello di base, che passa i dati senza alcuna trasformazione dall'input all'output.
Nota bene
In un comando Miller, è sempre necessario inserire almeno uno dei suoi verbi. Qui è cat
.
C'è anche la versione "breve" dello stesso comando, in cui --icsv --otsv
, diventa --c2t
(ovvero da CSV
a TSV
, che in inglese è "CSV
TO TSV
"):
Qui a seguire i flag di base, per passare da uno dei possibili formati di input a uno di quelli di output.
IN/OUT | CSV | TSV | JSON | DKVP | NIDX | XTAB | PPRINT | Markdown |
---|---|---|---|---|---|---|---|---|
CSV | --c2t |
--c2j |
--c2d |
--c2n |
--c2x |
--c2p |
--c2m |
|
TSV | --t2c |
--t2j |
--t2d |
--t2n |
--t2x |
--t2p |
--t2m |
|
JSON | --j2c |
--j2t |
--j2d |
--j2n |
--j2x |
--j2p |
--j2m |
|
DKVP | --d2c |
--d2t |
--d2j |
--d2n |
--d2x |
--d2p |
--d2m |
|
NIDX | --n2c |
--n2t |
--n2j |
--n2d |
--n2x |
--n2p |
--n2m |
|
XTAB | --x2c |
--x2t |
--x2j |
--x2d |
--x2n |
--x2p |
--x2m |
|
PPRINT | --p2c |
--p2t |
--p2j |
--p2d |
--p2n |
--p2x |
--p2m |
Elenco formati¶
Il file di riferimento di input, usato per produrre i vari formati di output è base_category.csv
.
Per ognuno di questi, è stato inserito il comando per generarlo a partire dal CSV
di input.
CSV¶
mlr --csv cat base_category.csv
DKVP (il formato nativo)¶
mlr --c2d cat base_category.csv
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,dataNascita=2001-01-22,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,comuneNascita=Milano
A seguire, lo stesso input in altri dei formati supportati da Miller.
TSV¶
mlr --c2t cat base_category.csv
NIDX: Index-numbered¶
mlr --c2n cat base_category.csv
JSON¶
Warning
Il JSON di output di default di Miller 5 non è propriamente un JSON.
In Miller 5 (versione attuale, che a breve sarà superata dalla 6), l'output di default è il JSON Lines. La scelta deriva dal fatto che è un formato molto più comodo per l'elaborazione con strumenti di parsing di testo e di versionamento; perché in questo formato ogni linea è un JSON valido, e l'elaborazione per linea è molto più comoda e tipica per i client.
È quindi come sotto:
mlr --c2j cat base_category.csv
{"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", "dataNascita": "2001-01-22", "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, "comuneNascita": "Milano"}
Se si vuole un "vero" JSON bisogna aggiungere il flag --jlistwrap
:
mlr --c2j --jlistwrap cat base_category.csv
[
{ "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", "dataNascita": "2001-01-22", "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, "comuneNascita": "Milano" }
]
In Miller 6 (prossimo al rilascio) l'output di default è invece un JSON
:
mlr --c2j cat base_category.csv
[
{
"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",
"dataNascita": "2001-01-22",
"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,
"comuneNascita": "Milano"
}
]
Se in Miller 6 si vuole un JSON Lines (formato molto consigliato), bisogna scegliere il flag --ojsonl
:
mlr --icsv --ojsonl cat base_category.csv
{"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", "dataNascita": "2001-01-22", "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, "comuneNascita": "Milano"}
PPRINT: Pretty-printed tabular¶
mlr --c2p --barred cat base_category.csv
+--------+-------------+---------+------+---------------+
| nome | dataNascita | altezza | peso | comuneNascita |
+--------+-------------+---------+------+---------------+
| andy | 1973-05-08 | 176 | 86.5 | Roma |
| chiara | 1993-12-13 | 162 | 58.3 | Milano |
| guido | 2001-01-22 | 196 | 90.4 | Roma |
| sara | 2000-02-22 | 166 | 70.4 | Roma |
| giulia | 1997-08-13 | 169 | 68.3 | Milano |
+--------+-------------+---------+------+---------------+
XTAB: Vertical tabular¶
mlr --c2x cat base_category.csv
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
dataNascita 2001-01-22
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
comuneNascita Milano
Markdown¶
mlr --c2m cat base_category.csv
| nome | dataNascita | altezza | peso | comuneNascita |
| --- | --- | --- | --- | --- |
| andy | 1973-05-08 | 176 | 86.5 | Roma |
| chiara | 1993-12-13 | 162 | 58.3 | Milano |
| guido | 2001-01-22 | 196 | 90.4 | Roma |
| sara | 2000-02-22 | 166 | 70.4 | Roma |
| giulia | 1997-08-13 | 169 | 68.3 | Milano |
Casi speciali e consigli¶
File CSV (anche TSV) senza riga di intestazione¶
In questo file non è presente la riga di intestazione.
1,861265,C,A,0.071
1,861265,C,A,0.148
1,861265,C,G,0.001
1,861265,C,G,0.108
1,861265,C,T,0
1,861265,C,T,0.216
2,193456,G,A,0.006
2,193456,G,A,0.094
2,193456,G,C,0.011
2,193456,G,C,0.152
2,193456,G,T,0.003
2,193456,G,T,0.056
Si può fare riferimento ai campi in modo da numerico, con un progressivo numerico di una unità a partire da 1, da sinistra verso destra. Il flag
utile al caso è -N
, che dà per implicito che non ci sia la riga di intestazione (e ne assegna una temporanea con campi numerici) e che non venga aggiunta in output.
Quindi se da questo file vorrò estrarre le prime tre righe della prima colonna il comando sarà:
Per condividere esempi di dati da "leggere" a schermo¶
Molto spesso in mailing list, forum, su Stack Exchange, su GitHub è utile condividere una porzione di file sui cui si sta lavorando, in modo da essere più chiari nel descrivere qual è la questione che si sta affrontando con i dati.
Il formato consigliato è il pretty printed, che produce un output ben leggibile ovunque.
Ad esempio se lo si vuole applicare a questo CSV
, il comando
produce l'output sottostante, che si potrà copiare e incollare dovunque serva, producendo qualcosa di leggibile ovunque, senza vincoli di formattazione o client usato.
+--------+-------------+---------+------+---------------+
| nome | dataNascita | altezza | peso | comuneNascita |
+--------+-------------+---------+------+---------------+
| andy | 1973-05-08 | 176 | 86.5 | Roma |
| chiara | 1993-12-13 | 162 | 58.3 | Milano |
| guido | 2001-01-22 | 196 | 90.4 | Roma |
| sara | 2000-02-22 | 166 | 70.4 | Roma |
| giulia | 1997-08-13 | 169 | 68.3 | Milano |
+--------+-------------+---------+------+---------------+
In alternativa si può produrre un output in Markdown
, ma non è compatibile con tutti gli spazi di pubblicazione e/o tutti i client.