Skip to content

[R-es] Cortar una cadena por un caracter solo cuando no forma parte de una subcadena entrecomillada

6 messages · Marcelino de la Cruz, Francisco Viciana, Carlos J. Gil Bellosta +1 more

#
Hola, ¿qué tal?

Tengo el siguiente problema. Me llegan (simplificando) cadenas del tipo

1,2,"algo"; 3,"cosa"; 4,2,3,7;

y tengo que partirlas por el caracter ";" para meterlas en una lista.
Lo hago con strsplit y no tengo problemas...

... hasta que recibo cadenas como

1,2,"algo;todo"; 3,"cosa"; 4,2,3,7;

en las que existen puntos y coma "entrecomillados". En tales casos, la
función strsplit detecta 4 cadenas,

1,2,"algo          todo"          3,"cosa"         4,2,3,7

en lugar de las tres que quiero, es decir,

1,2,"algo;todo"        3,"cosa"         4,2,3,7

¿Alguien conoce alguna manera simple para que strsplit (u otras
funciones similares) partan la cadena por los ";" que no formen parte
de cadenas entrecomilladas? ¿Tal vez una expresión regular mágica que
reemplace todos los ";" entrecomillados por otra cosa?

(Sé que puedo leer la cadena caracter a caracter y guardar el estado
(entrecomillado o no) para distinguir los ";" que forman parte de las
cadenas de los que son propiamente separadores, pero es algo que me
gustaría poder evitar).

Un saludo,

Carlos J. Gil Bellosta
http://www.datanalytics.com
#
Supongo que no será tan fácil como esto, pero por si acaso....

Con tu ejemplo, si pones

strsplit(cadena,"; ") # con un espacio dentro de las comillas:

1,2,"algo;todo"        3,"cosa"         4,2,3,7

Saludos,

Marcelino


El 2013-02-18 13:05, Carlos J. Gil Bellosta escribió:

  
    
#
Me temo que no es tan fácil. En mi caso real no puedo asegurar que
haya espacios (ni nada en concreto) antes o después de los
separadores. El único criterio es que no se considere ";" separador
cuando esté incluido en una cadena entrecomillada.

Un saludo y muchas gracias en todo caso,

Carlos J. Gil Bellosta
http://www.datanalytics.com


El día 18 de febrero de 2013 13:47, MARCELINO DE LA CRUZ ROT
<marcelino.delacruz en upm.es> escribió:
#
Creo que esto Funciona:

## --------------------------------
x <- '1,2,"algo;todo"; 3,"cosa; mala"; 4,2,3,7;'
m <- gregexpr('"[^"]*"', x)
blanks <- function(n) {
   vapply(Map(rep.int, rep.int(" ", length(n)), n, USE.NAMES = FALSE),
          paste, "", collapse = "")
}
s <- x
regmatches(s, m) <- Map(blanks, lapply(regmatches(s, m), nchar))
m <- gregexpr("; *", s)
cbind(regmatches(x, m, invert = TRUE)[[1]])
## --------------------------------

La idea la he tomado del uno de los ejemplo del help(regmatches), donde 
se explica mejor su funcionamiento. A partir de aquí se podría hacer una 
función "strsplit.with.deli", que entre otras cosas solucionaría algunos 
de los fallos de importación del paquete "pxR".

Fran

El 18/02/2013 13:05, Carlos J. Gil Bellosta escribió:

  
    
#
Hola, ¿qué tal?

Se me ha ocurrido una alternativa:

x <- '1,2,"algo;todo"; 3,"cosa; mala"; 4,2,3,7;'
t(read.table(textConnection(x), sep = ";"))

Así se aprovecha que read.table sí que es capaz de distinguir los
separadores entrecomillados de los que no...

Y sí, efectivamente, en Lituania, las descripciones de algunos campos
de algunos ficheros con formato PC-Axis que quieren leer con pxR
incluyen puntos y comas...

Un saludo,

Carlos J. Gil Bellosta
http://www.datanalytics.com


El día 18 de febrero de 2013 16:09, Francisco Viciana
<franciscoj.viciana en juntadeandalucia.es> escribió:
1 day later