如何在R中导入ical .ics文件

7

我想将一个.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文件每次都具有相同的预期字段,因此似乎可以使用这些字段作为模板读取数据,但我无法弄清楚如何做到这一点。

2个回答

10

这里有一个例子

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

2

现在有一个更简单和更健壮的选择,就是CRAN上的calendar包(文档在这里)。从ICS文件导入到数据框只需要一行代码,创建新事件然后导出到新的ICS文件也很简单。


日历::ic_read("file.ics") 曾经对我有效(最后一次成功测试:2021年12月)。 到了2023年9月,如果有多个事件,它对我来说就会失败,并显示以下错误: Error in if (!is.na(x) & !x == "NA" & !grepl("^\d{8}T\d{6}Z?$", x)) { : the condition has length > 1 我找不到这个软件包的错误报告页面。 lukeA的解决方案对我有效。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接