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

Carlos J. Gil Bellosta cgb en datanalytics.com
Lun Feb 18 17:30:58 CET 2013


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



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