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

Francisco Viciana franciscoj.viciana en juntadeandalucia.es
Lun Feb 18 16:09:07 CET 2013


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
+--------------------------------------------------------------



Más información sobre la lista de distribución R-help-es