Quiero eliminar las comas dentro de las comillas dobles coincidentes dentro de un archivo CSV. La clave aquí es que debe estar entre comillas dobles coincidentes. Este RexExp no parece funcionar:

".*?,.*?"

No encuentra nada si se introduce el signo de interrogación. Entonces lo siguiente no funciona:

s/\(".*?\),\(.*?"\)/\1;\2/g

La siguiente línea es la línea de prueba de entrada. No coincide con el más corto.

21,C,101,1,,W,D,,"AAAAAAAA,, RBBBBBB,",CCCCCCCCCC DD EEEEEEEEEE,FFFFFF GGGGGGG HHHHHHHHH,III 101 JJ,,,,KKKKKKK LLLLLLLL M'MMMM N,"OOO, P'PPPP QQQQQQQQ RR R",SSSSSSSSSSSS TTTTTTTTTT,UUU 101 VV,,,,,12/1/1998,1/1/2050,ZZZZZZ

Quiero cambiar la coma en "AAAAAAAA ,, RBBBBBB", por un punto y coma "AAAAAAAA ;; RBBBBBB;" y "OOO, P'PPPP QQQQQQQQ RR R " a " OOO; P'PPPP QQQQQQQQ RR R " sin cambiar ninguna otra coma en la línea de entrada.

2
Guasqueño 25 ene. 2016 a las 18:06

3 respuestas

La mejor respuesta

Su expresión regular tiene un problema fundamental: el . puede coincidir con cualquier carácter, incluida una cita. El cuantificador perezoso no soluciona eso, simplemente lo hace funcionar en casos simples.

Además, ¿qué quieres hacer si hay varias comas?

Intenta esto en su lugar:

"[^",]*?,[^",]*"

O, para manejar varias comas dentro de la cita:

"([^",]*?,)+[^",]*"

Tenga en cuenta que esta expresión regular aún puede coincidir con texto no deseado, si desea evitarlo por completo, debe hacerlo mucho más complicado para hacer coincidir el ancla de inicio de línea y los pares reales de comillas y no solo dos comillas con una coma dentro.

0
Lucero 25 ene. 2016 a las 15:14

He probado esto para que funcione en su entrada de muestra:

s/\("[^"]*\),\([^"]*"\)/\1;\2/g

Ejecución en OSX y linux con el mismo resultado:

$ echo 21,C,101,1,,W,D,,\"AAAAAAAA,, RBBBBBB,\",CCCCCCCCCC DD EEEEEEEEEE,FFFFFF GGGGGGG HHHHHHHHH,III 101 JJ,,,,KKKKKKK LLLLLLLL M\'MMMM N,\"OOO, P\'PPPP QQQQQQQQ RR R\",SSSSSSSSSSSS TTTTTTTTTT,UUU 101 VV,,,,,12/1/1998,1/1/2050,ZZZZZZ | sed -e 's/\("[^"]*\),\([^"]*"\)/\1;\2/g'
21,C,101,1,,W,D,,"AAAAAAAA,, RBBBBBB;",CCCCCCCCCC DD EEEEEEEEEE,FFFFFF GGGGGGG HHHHHHHHH,III 101 JJ,,,,KKKKKKK LLLLLLLL M'MMMM N,"OOO; P'PPPP QQQQQQQQ RR R",SSSSSSSSSSSS TTTTTTTTTT,UUU 101 VV,,,,,12/1/1998,1/1/2050,ZZZZZZ
0
Antonio Pérez 25 ene. 2016 a las 21:44

Gnu-awk con FPAT puede manejar esto:

awk -v FPAT='"[^"]*"|[^,]*' -v OFS=, '{for(i=1; i<=NF; i++) gsub(/,/, ";", $i)} 1' file.csv

-v FPAT='"[^"]*"|[^,]*' establece el patrón de campo en "..." o cualquier cosa no es una coma. Una vez que los campos individuales se dividen bien como comillas dobles o sin coma, simplemente los iteramos y reemplazamos la coma por punto y coma usando gsub.

Demostración del código

Salida:

21,C,101,1,,W,D,,"AAAAAAAA RBBBBBB;",CCCCCCCCCC DD EEEEEEEEEE,FFFFFF GGGGGGG HHHHHHHHH,III 101 JJ,,,,KKKKKKK LLLLLLLL M'MMMM N,"OOO; P'PPPP QQQQQQQQ RR R",SSSSSSSSSSSS TTTTTTTTTT,UUU 101 VV,,,,,12/1/1998,1/1/2050,ZZZZZZ
0
anubhava 25 ene. 2016 a las 19:59