Su: Separazione in base al contenuto   [Contenuti][Indice]


4.7.1 Ancora sui file CSV

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>