
Tengo un archivo CSV grande donde las columnas están separadas por comas en cada caso. Sin embargo, aproximadamente el 5% de las veces la primera columna contiene una coma dentro de sí misma y se indica de esta manera por el hecho de que estos campos tendrán comillas si tienen una coma dentro.
¿Cuál sería una buena manera de leer este archivo de manera que no tratemos las comas como separadores siempre que estén entre comillas?
La mejor manera que se me ocurre sería hacer algo complejo con una pila o algo para ver si actualmente estamos entre comillas o no, pero creo que seguramente debe haber una manera más fácil. Nota: Nunca hay citas dentro de citas ni ningún otro caso aparte de este.
*ejemplos:
- Manzana, 10, 12, ....
- Plátano, 5, 10, ...
- "Banana, green", 3, 14, ... (Observe que esta línea tiene una coma pero tiene comillas para indicar esto)*
Me gustaría leer en esta última línea una variable como "Plátano, verde" en lugar del comportamiento predeterminado que se leería en plátano y verde como variables separadas.
Respuesta1
Con GNU awk para FPAT:
$ cat tst.awk
BEGIN { FPAT="[^,]*|\"[^\"]*\"" }
{
print
for (i=1; i<=NF; i++) {
print "\t" i, "<" $i ">"
}
print "---"
}
$ awk -f tst.awk file
Apple,10,12,...
1 <Apple>
2 <10>
3 <12>
4 <...>
---
Banana,5,10,...
1 <Banana>
2 <5>
3 <10>
4 <...>
---
"Banana, green",3,14,...
1 <"Banana, green">
2 <3>
3 <14>
4 <...>
---