Carlos J. Gil Bellosta
2013-Feb-18 12:05 UTC
[R-es] Cortar una cadena por un caracter solo cuando no forma parte de una subcadena entrecomillada
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
MARCELINO DE LA CRUZ ROT
2013-Feb-18 12:47 UTC
[R-es] Cortar una cadena por un caracter solo cuando no forma parte de una subcadena entrecomillada
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ó:> 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-- MARCELINO DE LA CRUZ ROT Universidad Politecnica de Madrid
Carlos J. Gil Bellosta
2013-Feb-18 14:50 UTC
[R-es] Cortar una cadena por un caracter solo cuando no forma parte de una subcadena entrecomillada
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ó:> 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ó: >> >> 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 > > > -- > MARCELINO DE LA CRUZ ROT > Universidad Politecnica de Madrid > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es
Francisco Viciana
2013-Feb-18 15:09 UTC
[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 +--------------------------------------------------------------