[R-es] Leer un txt a trozos

Jaume Tormo j@utorb|@ @end|ng |rom gm@||@com
Lun Feb 18 18:51:59 CET 2019


Hola a todos,

Muchas gracias a todos por la ayuda. Marcelino, tu idea ha sido la clave.
A falta de alguna comprobación os pego aquí el script que he hecho...
parece que funciona.
Por si le sirve a alguien, los datos son el output de hydrus 1D (
https://www.pc-progress.com/en/Default.aspx?hydrus-1d)
El archivo original lo podéis ver aquí:
https://www.dropbox.com/s/41b5wexpjdnztm9/Nod_Inf.out?dl=0

SCRIPT:
## **** recuerda quitar a mano las unidades en el archivo de texto ****

file<-"/home/jaume/Dropbox/FEINA/tasca_WTAM/models_sol/Hydrus/ModelDmoret_20190212/JAume/Nod_Inf.out.proves"
## cargar los datos
  texto <- scan(file, what ="character") #hace un vector de strings, un
elemento por string
  texto <- texto[c(26:length(texto))]    #quitamos la cabecera
  head(texto)
## marcar los time y end
  times <- grep("Time:",texto)  #posición de los time
  ends  <- grep("end",texto)    #posición de los end
  head(times);head(ends)        #comprobar
  head(texto)
## creamos la matriz para guardar
  matriufinal<-matrix(c(1:12),nrow=1)
  #rbind(matriufinal,c(1,2,3,4,5,6,7,8,9,10,11,12))
## empieza
  for ( i in 1:length(times)){
    #i<-1
  ## sacar la matriz para cada time
    inici<-times[i]+2               #lugar donde empieza la matriz
    final<-ends[i]-1                #lugar donde acaba la matriz
    troç<-texto[c(inici:final)]     #texto de la primera matriz guardado
como troç
    head(troç,11);tail(troç,11)     #comprobar
    m<-matrix(troç,nc=11,byrow = T) #hacemos la matriz
  ## primera fila con nombres de columna
    colnames(m)<-m[1,]            # ponemos el nombre
    m<-m[-1,]                     # Borramos la fila de nombres
  ## añadir columna diciendo el timepo (Time)
    m<-cbind(m,rep(i-1,nrow(m)))
    colnames(m)[12]<-"time"
  ## añadirlo a la matriz final
    matriufinal<-rbind(matriufinal,m)
  }
## convertirlo en dataframe
  dades.m<-matriufinal
  # quitarar la primera columna que habiamo puesto al crear la matriz de
guardar
    dades.m<-dades.m[-1,]
  # convertir en numérico
    mode(dades.m)<-"numeric"
  #convertir en dataframe
    dades<-as.data.frame(dades.m)

Jaume.


El mar., 12 feb. 2019 a las 19:16, Jaume Tormo (<jautorbla using gmail.com>)
escribió:

> Estimad using s eRRer using s,
>
> Tengo un txt que quiero importar a R.
> Pero no tiene un formato adecuado para usar cosas normales, como por
> ejemplo read.csv()
> El formato es algo así:
> time 1
> col1 col2 col3 col4
> dato dato dato dato
> dato dato dato dato
> dato dato dato dato
> dato dato dato dato
> dato dato dato dato
> end
>
> time 2
> col1 col2 col3 col4
> dato dato dato dato
> dato dato dato dato
> dato dato dato dato
> dato dato dato dato
> dato dato dato dato
> end
>
> time 3
> col1 col2 col3 col4
> dato dato dato dato
> dato dato dato dato
> dato dato dato dato
> dato dato dato dato
> dato dato dato dato
> end
>
> Lo que me gustaría decirle a R es "ves a donde pone time y tráete X
> lineas" o "ves a donde pone time y tráete lineas hasta que llegues a end"
> En realidad debe ser bastante fácil, todas las tablas empiezan con time y
> acaban con end y tienen el mismo numero de filas.
> He estado mirando readPlain(), scan(), readfile()... pero le puedes decir
> cuantas lineas leer pero no donde empezar... creo.
> ¿Alguna pista de por donde puedo empezar a mirar?
>
> Muchas gracias.
>
>
> --
> Jaume Tormo.
> https://es.linkedin.com/in/jaumetormo
> https://acercad.wordpress.com/
>


-- 
Jaume Tormo.
https://es.linkedin.com/in/jaumetormo
https://acercad.wordpress.com/

	[[alternative HTML version deleted]]



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