2010-04-13 12 views
7

Quiero importar el contenido de un archivo csv en R, el archivo csv contiene varias secciones de datos verticalmente, separados por líneas en blanco y asteriscos. Por ejemploCómo importar un archivo CSV que contiene varias secciones en R?

******************************************************** 
* SAMPLE DATA ****************************************** 
******************************************************** 
Name, DOB, Sex 
Rod, 1/1/1970, M 
Jane, 5/7/1980, F 
Freddy, 9.12,1965, M 

******************************************************* 
* Income Data **************************************** 
******************************************************* 
Name, Income 
Rod, 10000 
Jane, 15000 
Freddy, 7500 

Me gustaría importar esto en R como dos dataframes separados. Actualmente estoy recortando manualmente el archivo csv en archivos más pequeños, pero creo que podría hacerlo utilizando read.csv y la configuración de omisión y salto de read.csv, si pudiera averiguar dónde están los saltos de sección.

Esto me da una verdadera lógica para cada línea en blanco

ifelse(readLines("DATA.csv")=="",TRUE,FALSE) 

Estoy esperando que alguien ya ha resuelto este problema.

+1

Esta pregunta SO es vagamente similar http://stackoverflow.com/questions/509595/csv-file-with-multiple-time-series – PaulHurleyuk

+0

El uso de 'ifelse' es redundante en este caso. 'readLines (" DATA.csv ") ==" "' funciona de la misma manera. – Marek

Respuesta

4

En este caso voy a hacer algo como:

# Import raw data: 
data_raw <- readLines("test.txt") 

# find separation line: 
id_sep <- which(data_raw=="") 

# create ranges of both data sets: 
data_1_range <- 4:(id_sep-1) 
data_2_range <- (id_sep+4):length(data_raw) 

# using ranges and row data import it: 
data_1 <- read.csv(textConnection(data_raw[data_1_range])) 
data_2 <- read.csv(textConnection(data_raw[data_2_range])) 

En realidad el primer conjunto de ejemplo tiene la estructura inconsistente por lo data_1 tiene un aspecto extraño.

1

Tal vez este fragmento no probado puede ser útil:

reader <- file("DATA.CSV", "r") 
lines <- readLines(reader) 
writer1 <- textConnection("csv1", open = "w", local = TRUE) 
writer2 <- textConnection("csv2", open = "w", local = TRUE) 
currWriter <- writer1 
lastLine <- length(lines) 
lineNumber <- 4 
repeat { 
    if (lineNumber>lastLine) break 
    if (lines[lineNumber]=="********************************************************") { 
     lineNumber <- lineNumber + 2 # eat two lines 
     currWriter <- writer2 
    } else { 
     writeLines(line, currWriter) 
    } 
    lineNumber <- lineNumber + 1 
} 
close(reader) 
close(writer1) 
close(writer2) 
csv1Reader <- textConnection(csv1, "r") 
csv2Reader <- textConnection(csv2, "r") 
df1 <- read.csv(csv1Reader) 
df2 <- read.csv(csv2Reader) 
close(csv1Reader) 
close(csv2Reader) 
Cuestiones relacionadas