2010-04-13 47 views
7

我想将csv文件的内容导入到R中,csv文件包含垂直数据的多个部分,用空行和星号分隔。例如如何将包含多个部分的CSV文件导入到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 

我想导入到R作为两个单独的数据框。目前我手动将csv文件剪切成较小的文件,但我认为我可以使用read.csv和read.csv的skip和nrows设置来完成它,如果我可以计算出secion中断的位置。

这给了我一个逻辑TRUE为每个空白行

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

我希望有人已经解决了这个问题。

+1

这个SO问题隐约相似http://stackoverflow.com/questions/509595/csv-file-with-multiple-time-series – PaulHurleyuk 2010-04-13 10:20:47

+0

在这种情况下使用'ifelse'是多余的。 'readLines(“DATA.csv”)==“”'的工作原理是一样的。 – Marek 2010-04-14 11:44:04

回答

4

在这种情况下,我会做这样的事情:

# 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])) 

其实你的第一个例子集有不一致的结构,因此data_1看起来很奇怪。

1

也许这个未经测试的片段会有所帮助:

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) 
相关问题