2013-03-14 81 views
1

我需要在R中讀取csv文件。但該文件在一些行中包含一些文本信息而不是逗號值。所以我無法使用read.csv(fileName)方法讀取該文件。 該文件的內容如下:如何讀取包含一些額外文本數據的csv文件

name:russel date:21-2-1991 
abc,2,saa 
anan,3,ds 
ama,ds,az 
,, 

name:rus date:23-3-1998 
snans,32,asa 
asa,2,saz 

我需要存儲每個名字的唯一值,日期對作爲數據幀。要做到這一點,我該如何讀取該文件?

其實我的要求輸出

>dataFrame1 
    abc,2,saa 
    anan,3,ds 
    ama,ds,az 
>dataFrame2 
    snans,32,asa 
    asa,2,saz 
+3

看這個http://stackoverflow.com/q/4629115/1290420 – gauden 2013-03-14 06:24:49

回答

7

您可以使用scan讀取數據並使用grepsub函數來提取重要的值。

文本:

text <- "name:russel date:21-2-1991 
abc,2,saa 
anan,3,ds 
ama,ds,az 
,, 

name:rus date:23-3-1998 
snans,32,asa 
asa,2,saz" 

這些命令產生具有名稱和日期值的數據幀。

# read the text 
lines <- scan(text = text, what = character()) 
# find strings staring with 'name' or 'date' 
nameDate <- grep("^name|^date", lines, value = TRUE) 
# extract the values 
values <- sub("^name:|^date:", "", nameDate) 
# create a data frame 
dat <- as.data.frame(matrix(values, ncol = 2, byrow = TRUE, 
          dimnames = list(NULL, c("name", "date")))) 

其結果是:

> dat 
    name  date 
1 russel 21-2-1991 
2 rus 23-3-1998 

更新

爲了提取從字符串,不包含名稱和日期信息的值,下面的命令,可以使用:

# read data 
lines <- readLines(textConnection(text)) 
# split lines 
splitted <- strsplit(lines, ",") 
# find positions of 'name' lines 
idx <- grep("^name", lines)[-1] 
# create grouping variable 
grp <- cut(seq_along(lines), c(0, idx, length(lines))) 
# extract values 
values <- tapply(splitted, grp, FUN = function(x) 
             lapply(x, function(y) 
                if (length(y) == 3) y)) 
create a list of data frames 
dat <- lapply(values, function(x) as.data.frame(matrix(unlist(x), 
                 ncol = 3, byrow = TRUE))) 

結果:

> dat 
$`(0,7]` 
    V1 V2 V3 
1 abc 2 saa 
2 anan 3 ds 
3 ama ds az 

$`(7,9]` 
    V1 V2 V3 
1 snans 32 asa 
2 asa 2 saz 
+0

sir.this答案對我來說是非常有用的。但我需要的實際輸出是不同的。請參閱問題中的編輯。 – 2013-03-14 08:44:12

+1

@DinoopNair查看我答案的更新。 – 2013-03-14 09:16:28

+0

非常感謝你的幫助先生.. :) – 2013-03-14 09:31:53

4

我會首先讀取整個文件作爲一個字符列表,即對於文件中的每一行的字符串,這可以使用readLines完成。接下來,您必須找到新日期數據的起始地點,即查找'',請參閱grep。然後取出每個數據塊的第一個入口,例如使用stringr包中的str_extract。最後,您需要拆分所有的剩餘數據字符串,請參閱strsplit

相關問題