2012-09-02 8 views
6

Estoy leyendo archivos de datos en formato de texto usando readLines. La primera 'columna' es un texto complicado que no necesito. Las siguientes columnas contienen datos que necesito. La primera 'columna' y los datos están separados por dos puntos (:). Deseo dividir cada fila en el primer punto y eliminar la cadena de texto resultante, manteniendo solo los datos.División de cadenas en el primer punto

A continuación se muestra un archivo de datos de ejemplo. Una posible complicación es que una línea de datos contiene múltiples dos puntos. Esa línea puede en algún momento convertirse en mi encabezado. Entonces, probablemente no debería dividirme en cada colon, solo en el primer colon.

my.data <- "first string of text..: aa : bb : cc 
      next string ........ : 2 0 2 
      third string......1990: 7 6 5 
      last string   : 4 2 3" 

my.data2 <- readLines(textConnection(my.data)) 
my.data2 

He tratado código presentado aquí:

Split on first comma in string

y aquí:

Código

R: removing the last three dots from a string

en el primer enlace de arriba parece dividir solamente en los primeros dos puntos de la primera fila. Es probable que el código en el segundo enlace haga lo que yo quiera, pero es demasiado complejo como para modificarlo satisfactoriamente hasta el momento.

Éstos son los datos espero obtener, momento en el que simplemente puedo reemplazar a los dos puntos restantes en la primera fila con espacios vacíos usando una muy simple gsub declaración:

aa : bb : cc 
    2 0 2 
    7 6 5 
    4 2 3 

Lo siento si esto es un duplicado de una publicación que no he localizado y gracias por cualquier consejo o asistencia.

Respuesta

15

A continuación se iniciará en el principio de la cadena y luego agarrar todo hasta e incluyendo el primer colon y espacios adicionales y reemplazar eso con nada (esencialmente sólo quitarla)

gsub("^[^:]+:\\s*", "", my.data2) 

Si Don 't quiere quitar los espacios que podría hacer

gsub("^[^:]+:", "", my.data2) 

para algunas aclaraciones sobre lo que la expresión regular original se hacía.Comenzando por el principio:

^ esto dice que sólo se encuentran coincidencias en el inicio de la cadena

[^:] esto representa cualquier carácter que no es de dos puntos

+ esto dice que coincide con el carácter anterior una o más veces (por lo que coincide con el mayor número de caracteres que no sean los dos puntos como sea posible)

: esto es lo que en realidad coincide con el de colon

\\s esto coincide con un espacio

* esto dice que coincide con el carácter anterior cero o más veces (por lo que eliminar cualquier espacio adicional después de los dos puntos)

Así que ponerlo todo junto empezamos por el principio de la cadena luego unir tantos caracteres que no sean de dos puntos como sea posible, luego tomar el primer carácter de dos puntos y cualquier espacio adicional y reemplazar todo eso con nada (esencialmente eliminando toda la basura que no queremos).

+0

Gracias por la respuesta y la excelente explicación. –

+5

+1 para la explicación –

Cuestiones relacionadas