[R-es] Cortar una cadena por un caracter solo cuando no forma parte de una subcadena entrecomillada
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? 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
_______________________________________________ R-help-es mailing list R-help-es en r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
+-------------------------------------------------------------- | Francisco J. Viciana Fernández | Coordinador del Registro de Población | Servicio de EstadÃsticas Demográficas y Sociales | Instituto de EstadÃstica y CartografÃa de AndalucÃa | Leonardo Da Vinci, nº 21. Isla de La Cartuja. | 41071 SEVILLA. | franciscoj.viciana en juntadeandalucia.es +--------------------------------------------------------------