Manuel Collado fa notare che, oltre alle virgole, un campo CSV può anche
contenere apici, che devono essere protetti raddoppiandoli.
Le espressione regolari descritte sopra non sono in grado di accettare
campi fra apici che contengano al loro interno sia virgole che apici.
Egli suggerisce che l’espressione più semplice di FPAT
in grado
di riconoscere tale tipo di campi è /([^,]*)|("([^"]|"")+")/
.
Egli ha preparato questo input come test per riconoscere queste varianti:
p,"q,r",s p,"q""r",s p,"q,""r",s p,"",s p,,s
E questo è il suo programma di test:
BEGIN { fp[0] = "([^,]+)|(\"[^\"]+\")" fp[1] = "([^,]*)|(\"[^\"]+\")" fp[2] = "([^,]*)|(\"([^\"]|\"\")+\")" FPAT = fp[fpat+0] }
{ print "<" $0 ">" printf("NF = %s ", NF) for (i = 1; i <= NF; i++) { printf("<%s>", $i) } print "" }
Se eseguito usando la terza variante di FPAT
,
il programma produce in output:
$ gawk -v fpat=2 -f test-csv.awk sample.csv -| <p,"q,r",s> -| NF = 3 <p><"q,r"><s> -| <p,"q""r",s> -| NF = 3 <p><"q""r"><s> -| <p,"q,""r",s> -| NF = 3 <p><"q,""r"><s> -| <p,"",s> -| NF = 3 <p><""><s> -| <p,,s> -| NF = 3 <p><><s>