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-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
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
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
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 +--------------------------------------------------------------
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ó:
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 +--------------------------------------------------------------
_______________________________________________ R-help-es mailing list R-help-es en r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
1 day later
An embedded and charset-unspecified text was scrubbed... Name: no disponible URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20130219/778c4053/attachment.pl>