2012-09-27 44 views
25

Me gustaría leer un archivo de texto en R, línea por línea, usando un ciclo for y con la longitud del archivo. El problema es que solo imprime el carácter (0). Este es el código:leyendo un archivo de texto en R línea por línea

fileName="up_down.txt" 
con=file(fileName,open="r") 
line=readLines(con) 
long=length(line) 
for (i in 1:long){ 
    linn=readLines(con,1) 
    print(linn) 
} 
close(con) 
+8

El problema es que usted lee el archivo completo en ('line = readLines (con)') y luego continúa leyendo el archivo dentro del ciclo; en el punto, no hay nada más para leer. –

+0

Si está buscando una manera de cargar solo una línea a la vez de un archivo (tal vez grande), entonces la [respuesta aceptada actualmente] (http://stackoverflow.com/a/12627356/1067114) no resuelve su problema. problema. Si, en cambio, solo desea procesar el contenido de un archivo línea por línea, independientemente de cómo lo cargue, tal vez la pregunta debería formularse mejor. –

Respuesta

25

Aquí está la solución con un bucle for. Es importante destacar que lleva una llamada a readLines fuera del bucle for para que no se llame incorrectamente una y otra vez. Aquí está:

fileName <- "up_down.txt" 
conn <- file(fileName,open="r") 
linn <-readLines(conn) 
for (i in 1:length(linn)){ 
    print(linn[i]) 
} 
close(conn) 
+2

No necesita el bucle for ya que está imprimiendo todo el vector. Solo 'print (linn)' es suficiente. –

+1

Muy buena respuesta. En R "<-" se usa normalmente en la convención en lugar de "=" – Ryan

+2

, ¿qué ocurre si tiene un archivo de 30 gigas? – Chris

31

sólo tiene que utilizar readLines en su archivo:

R> res <- readLines(system.file("DESCRIPTION", package="MASS")) 
R> length(res) 
[1] 27 
R> res 
[1] "Package: MASS"                 
[2] "Priority: recommended"               
[3] "Version: 7.3-18"                 
[4] "Date: 2012-05-28"                
[5] "Revision: $Rev: 3167 $"               
[6] "Depends: R (>= 2.14.0), grDevices, graphics, stats, utils"      
[7] "Suggests: lattice, nlme, nnet, survival"           
[8] "[email protected]: c(person(\"Brian\", \"Ripley\", role = c(\"aut\", \"cre\", \"cph\")," 
[9] "  email = \"[email protected]\"), person(\"Kurt\", \"Hornik\", role" 
[10] "  = \"trl\", comment = \"partial port ca 1998\"), person(\"Albrecht\"," 
[11] "  \"Gebhardt\", role = \"trl\", comment = \"partial port ca 1998\"),"  
[12] "  person(\"David\", \"Firth\", role = \"ctb\"))"       
[13] "Description: Functions and datasets to support Venables and Ripley,"    
[14] "  'Modern Applied Statistics with S' (4th edition, 2002)."     
[15] "Title: Support Functions and Datasets for Venables and Ripley's MASS"   
[16] "License: GPL-2 | GPL-3"               
[17] "URL: http://www.stats.ox.ac.uk/pub/MASS4/"          
[18] "LazyData: yes"                 
[19] "Packaged: 2012-05-28 08:47:38 UTC; ripley"          
[20] "Author: Brian Ripley [aut, cre, cph], Kurt Hornik [trl] (partial port"   
[21] "  ca 1998), Albrecht Gebhardt [trl] (partial port ca 1998), David"   
[22] "  Firth [ctb]"                
[23] "Maintainer: Brian Ripley <[email protected]>"        
[24] "Repository: CRAN"                
[25] "Date/Publication: 2012-05-28 08:53:03"           
[26] "Built: R 2.15.1; x86_64-pc-mingw32; 2012-06-22 14:16:09 UTC; windows"   
[27] "Archs: i386, x64"                
R> 

Hay un manual completo dedicado a este ...

+0

Estoy usando readLines, pero no entiendo por qué me sale ese error – Layla

+0

Cuando dice que hay un manual completo dedicado a él, también debe decirnos qué manual es. –

57

Debe tener cuidado con readLines(...) y archivos grandes. Leer todas las líneas en la memoria puede ser riesgoso. A continuación se muestra un ejemplo de cómo leer el archivo y proceso de una sola línea en el tiempo:

processFile = function(filepath) { 
    con = file(filepath, "r") 
    while (TRUE) { 
    line = readLines(con, n = 1) 
    if (length(line) == 0) { 
     break 
    } 
    print(line) 
    } 

    close(con) 
} 

comprender el riesgo de leer una línea en la memoria también. Los archivos grandes sin saltos de línea también pueden llenar tu memoria.

+3

Esto realmente debería ser la respuesta aceptada, ya que los demás se encontrarán con problemas con archivos de gran tamaño. – theduke

+0

Se sugiere que esta sea una forma correcta de analizar un archivo grande línea por línea. Otras respuestas se leen en todas las líneas en la memoria, y luego bucle ese objeto en la memoria, que es absolutamente diferente de esto. –

1

Escribo un código para leer el archivo línea por línea para satisfacer mi demanda, que línea diferente tiene tipos de datos diferentes, siga los artículos: read-line-by-line-of-a-file-in-r y determining-number-of-linesrecords. Y debería ser una mejor solución para archivos grandes, creo. Mi versión R (3.3.2).

con = file("pathtotargetfile", "r") 
readsizeof<-2 # read size for one step to caculate number of lines in file 
nooflines<-0  # number of lines 
while((linesread<-length(readLines(con,readsizeof)))>0) # calculate number of lines. Also a better solution for big file 
    nooflines<-nooflines+linesread 

con = file("pathtotargetfile", "r") # open file again to variable con, since the cursor have went to the end of the file after caculating number of lines 
typelist = list(0,'c',0,'c',0,0,'c',0) # a list to specific the lines data type, which means the first line has same type with 0 (e.g. numeric)and second line has same type with 'c' (e.g. character). This meet my demand. 
for(i in 1:nooflines) { 
    tmp <- scan(file=con, nlines=1, what=typelist[[i]], quiet=TRUE) 
    print(is.vector(tmp)) 
    print(tmp) 
} 
close(con) 
Cuestiones relacionadas