Sanity check di un file CSV
A cura di
Dennis Angemi
| issue
#255
| guida/e
Andrea Borruso
Introduzione
A volte, quando si lavora con dei CSV, torna utile sapere se questi file rispettano le specifiche RFC 4180 che definiscono lo standard.
Se hai installato miller e vuoi indagare la conformità allo standard di un CSV (denominato, ad esempio, file.csv) puoi semplicemente lanciare da riga di comando
mlr --csv check file.csv
Nel caso in cui il check fallisce, non è raro osservare messaggi di errore di questo tipo
mlr: CSV header/data length mismatch 4 != 1 at filename test.csv row 2.
Tuttavia capita di avere tra le mani un CSV non standard (non rispetta RFC 4180) che risulta comunque interpretabile come tale. Per lanciare un sanity check allora useremo il comando precedente sostituendo l’opzione --csv con --csvlite, come in questo esempio:
mlr --csvlite check file.csv
Se il file è sano, non otterremo nessun messaggio.
Use case
Sia file.csv così fatto
id,command,duration,description
1,./launcher "./spawner ec 800000 885000 800000 5 0 best_individual" 25 100000 20 0.2 0.8 stats.csv,,lorem ipsum
2,./launcher "./spawner ec 1200000 1200000 1100000 8 0 best_individual" 25 10000 25 0.25 0.75 stats.csv,,lorem ipsum
3,./launcher "./spawner ec 1100000 1100000 1000000 8 0 best_individual" 25 10000 1 0.25 0.75 stats.csv,,lorem ipsum
4,./launcher "./spawner ec 8800 20000 20000 100 0 best_individual" 25 10000 1 0.25 0.75 stats.csv,,lorem ipsum
5,../../bin/launcher "../../bin/spawner ../../bin/ec 600000 100000 400000 20 0 best_individual" 5 10 10 0.25 0.75 stats.csv,,
6,../../bin/launcher "../../bin/spawner ../../bin/ec 50000 7000 9000 80 0 best_individual" 5 10 10 0.25 0.75 stats,,test
Lanciando
mlr --csv check file.csv
si ottiene
mlr: CSV header/data length mismatch 4 != 1 at filename test.csv row 2.
il che vuol dire che file.csv non rispetta lo standard RFC 4180.
Questo file è comunque interpretabile come un CSV? Scopriamolo lanciando
mlr --csvlite check file.csv
Non otteniamo nessun errore. Possiamo continuare a lavorarci essendo consapevoli di questo dettaglio ;)