2017-04-23 71 views
4

我想導入.ics file爲R,但是,當我嘗試這樣做像...如何導入的iCal的.ics文件中的R

sneak_cal <- read.delim("iCal-TribeEvents.ics", sep = ":", header=FALSE, stringsAsFactors = FALSE, strip.white = TRUE, na.strings = "") 

...我結束了分裂性格網站的字符串(屬於X-ORIGINAL-URLUID場)也一樣,這是不可取的

https//www.kicksonfire.com

的最終目標是將數據進入一個整潔的格式,其中每一行代表單VEVENT,我認爲會通過一個獨特的UID表示,沒有信息(如URL)

任何損失是否有建議,如另一種方法預先定義有望作爲該場鍵和匹配的值或空的空間到該鍵?由於.ics文件每次都有相同的預期字段,因此將這些字段用作模板來讀取數據似乎是有意義的,但我無法弄清楚如何去做。

回答

5

下面是一個例子

x <- readLines("https://www.kicksonfire.com/releases/?ical=1&tribe_display=list", warn = FALSE) 
stopifnot(!any(grepl("^\\s+", x))) # disregarding value fields that have linefeeds for the sake of simplicity 
keyval <- do.call(rbind, regmatches(x, regexpr(":", x, fixed = TRUE), invert = TRUE)) 
keyval <- keyval[which.max(keyval[,1]=="BEGIN" & keyval[,2]=="VEVENT"):tail(which(keyval[,1]=="END" & keyval[,2]=="VEVENT"), 1),] 
keyval <- cbind.data.frame(keyval, id=cumsum(keyval[,1]=="BEGIN" & keyval[,2]=="VEVENT")) 
df <- reshape(keyval, timevar="1", idvar="id", direction = "wide") 
head(df[,c(3,4,9)]) 
# 2.DTSTART;VALUE=DATE 2.DTEND;VALUE=DATE        2.SUMMARY 
# 1    20170422   20170423   Air Jordan 11 Low GS Blue Moon 
# 14    20170422   20170423  Air Jordan 5 Premium Pure Platinum 
# 27    20170427   20170428    Nike Air VaporMax Asphalt 
# 40    20170427   20170428     Nike Air VaporMax Oreo 
# 53    20170427   20170428 Nike WMNS Air VaporMax White Ice Blue 
# 66    20170427   20170428 wings+horns x adidas NMD R2 Light Grey