2010-07-31 30 views
5

Tengo un archivo CSV cuya primera fila contiene los nombres de las variables y el resto de las filas contiene los datos. ¿Cuál es una buena manera de dividirlo en archivos que contienen solo una variable en R? ¿Esta solución va a ser robusta? P.ej. ¿y si el archivo de entrada tiene un tamaño de 100G?¿Cómo se divide un gran archivo de datos CSV en archivos de datos individuales usando R?

Los archivos de entrada parece

var1,var2,var3 
1,2,hello 
2,5,yay 
... 

quiero crear 3 (o sin embargo muchas variables) archivos var1.csv, var2.csv, var3.csv para que los archivos se asemejan Fichero1

var1 
1 
2 
... 

archivo2

var2? 
2 
5 
... 

File3

var3 
hello 
yay 

tengo una solución en Python (How to break a large CSV data file into individual data files?) pero me pregunto si R puede hacer lo mismo? Esencial el código de Python lee el archivo csv línea por línea y luego escribe las líneas una a la vez. ¿Puede R hacer lo mismo? El comando read.csv lee todo el archivo de una sola vez y esto puede retrasar todo el proceso. Además, no puede leer un archivo 100G y procesarlo cuando R intenta leer todo el archivo en la memoria. No puedo encontrar un comando en R que permita leer un archivo csv línea por línea. Por favor ayuda. ¡¡Gracias!!

+0

hey xiaodai, ver el nuevo código. – apeescape

Respuesta

6

Puede scan y luego write en un archivo (s) una línea a la vez.

i <- 0 
while({x <- scan("file.csv", sep = ",", skip = i, nlines = 1, what = "character"); 
     length(x) > 1}) { 
    write(x[1], "file1.csv", sep = ",", append = T) 
    write(x[2], "file2.csv", sep = ",", append = T) 
    write(x[3], "file3.csv", sep = ",", append = T) 
    i <- i + 1 
} 

edición !! Estoy usando los datos anteriores, copiados más de 1000 veces. He hecho una comparación de velocidad cuando tenemos la conexión de archivos abierta en todo momento.

ver1 <- function() { 
    i <- 0 
    while({x <- scan("file.csv", sep = ",", skip = i, nlines = 1, what = "character"); 
     length(x) > 1}) { 
    write(x[1], "file1.csv", sep = ",", append = T) 
    write(x[2], "file2.csv", sep = ",", append = T) 
    write(x[3], "file3.csv", sep = ",", append = T) 
    i <- i + 1 
    } 
} 

system.time(ver1()) # w/ close to 3K lines of data, 3 columns 
## user system elapsed 
## 2.809 0.417 3.629 

ver2 <- function() { 
    f <- file("file.csv", "r") 
    f1 <- file("file1.csv", "w") 
    f2 <- file("file2.csv", "w") 
    f3 <- file("file3.csv", "w") 
    while({x <- scan(f, sep = ",", skip = 0, nlines = 1, what = "character"); 
     length(x) > 1}) { 
    write(x[1], file = f1, sep = ",", append = T, ncol = 1) 
    write(x[2], file = f2, sep = ",", append = T, ncol = 1) 
    write(x[3], file = f3, sep = ",", append = T, ncol = 1) 
    } 
    closeAllConnections() 
} 

system.time(ver2()) 
## user system elapsed 
## 0.257 0.098 0.409 
+0

Gracias. Investigaré y escribiré. – xiaodai

+0

Este está bien. Pero me pareció extremadamente lento. El código de ejemplo de Python abre los archivos y luego los atraviesa. Creo que en este escaneo de código se abre el archivo va a la ubicación de lectura, lee los datos, luego cierra el archivo; entonces se repite. De ahí la lentitud. ¿Puede R abrir un archivo como Python, lo mantiene abierto y lo atraviesa? No creo que Scan lo esté haciendo. – xiaodai

+0

bien, estaba pensando lo mismo. este enlace puede ayudar: http://cran.r-project.org/doc/manuals/R-data.html#Output-toconconnections – apeescape

Cuestiones relacionadas