Necesito dividir una cuerda larga. Los lugares donde las divisiones no deberían tener nada en común excepto el hecho de que son fechas seguidas de tiempo. Por lo tanto, necesito dividir la cadena en función de la aparición de un patrón específico, a saber, dd/mm/yyyy, hh:mm. Si bien conozco las funciones strsplit y los manipuladores de cadenas aliados, no parecen ayudar. La muestra de los datos está abajo.

25/06/15, 21:37 - kjadshjabsdjab
25/06/15, 21:39 - bsadhi2342/342jbjsd
25/06/15, 21:40 -hkgsad/213/1sadjaa
25/06/15, 21:41 - hsdjhakhjbk12/21s/sda:sdfjbj
25/06/15, 21:42 - jkadbsh2:/\sdsadjv
25/06/15, 21:42 -
4
stochastic13 25 dic. 2016 a las 15:07

3 respuestas

La mejor respuesta

Podemos usar las expresiones regulares de expresiones regulares para dividir

strsplit(str1, "(?<=[0-9]{2}:[0-9]{2})", perl = TRUE)

Si necesitamos incluir también la 'Fecha'

strsplit(str1, "(?<=[0-9]{2}/[0-9]{2}/[0-9]{2}, [0-9]{2}:[0-9]{2})", perl = TRUE)

Si no queremos la hora de la fecha, entonces

setdiff(strsplit(str1, "[0-9]{2}/[0-9]{2}/[0-9]{2}, [0-9]{2}:[0-9]{2}\\s*-\\s*")[[1]], "")
#[1] "kjadshjabsdjab"               "bsadhi2342/342jbjsd" 
#[3] "hkgsad/213/1sadjaa"           "hsdjhakhjbk12/21s/sda:sdfjbj" 
#[5] "jkadbsh2:/\\sdsadjv" 
3
akrun 25 dic. 2016 a las 12:35

Puede modificar la expresión regular o mutar + sub el - de distancia si no es necesario:

library(stringi)
library(purrr)

lines <- readLines(textConnection('25/06/15, 21:37 - kjadshjabsdjab\n25/06/15, 21:39 - bsadhi2342/342jbjsd\n25/06/15, 21:40 -hkgsad/213/1sadjaa\n25/06/15, 21:41 - hsdjhakhjbk12/21s/sda:sdfjbj\n25/06/15, 21:42 - jkadbsh2:/\\sdsadjv\n25/06/15, 21:42 -'))

stri_match_all_regex(lines, "([[:digit:]]{2}/[[:digit:]]{2}/[[:digit:]]{2}, [[:digit:]]{2}:[[:digit:]]{2})(.*)") %>%
  map_df(~setNames(as.list(.[,2:3]), c("ts", "string")))
## # A tibble: 6 × 2
##                ts                          string
##             <chr>                           <chr>
## 1 25/06/15, 21:37                - kjadshjabsdjab
## 2 25/06/15, 21:39           - bsadhi2342/342jbjsd
## 3 25/06/15, 21:40             -hkgsad/213/1sadjaa
## 4 25/06/15, 21:41  - hsdjhakhjbk12/21s/sda:sdfjbj
## 5 25/06/15, 21:42           - jkadbsh2:/\\sdsadjv
## 6 25/06/15, 21:42                               -
2
hrbrmstr 25 dic. 2016 a las 17:15

Uno podría dividirse en "-" y luego excluir los últimos 15 caracteres. La función sapply se puede usar para aplicar la función substr a cada elemento de la lista:

> ss = "25/06/15, 21:37 - kjadshjabsdjab25/06/15, 21:39 - bsadhi2342/342jbjsd25/06/15, 21:40 - hkgsad/213/1sadjaa25/06/15, 21:41 - hsdjhakhjbk12/21s/sda:sdfjbj25/06/15, 21:42 - jkadbsh2:sdsadjv25/06/15, 21:42 -"
> 
> sapply(strsplit(ss, " - "), function(x) substr(x, 1, nchar(x)-15))
     [,1]                          
[1,] ""                            
[2,] "kjadshjabsdjab"              
[3,] "bsadhi2342/342jbjsd"         
[4,] "hkgsad/213/1sadjaa"          
[5,] "hsdjhakhjbk12/21s/sda:sdfjbj"
[6,] "jkadbsh2:sdsadjv25"          
1
rnso 25 dic. 2016 a las 13:14