我想在R中解析一个access.log。它有以下形式,我想把它放到data.frame中:
TIME="2013-07-25T06:28:38+0200" MOBILE_AGENT="0" HTTP_REFERER="-" REQUEST_HOST="www.example.com" APP_ENV="envvar" APP_COUNTRY="US" APP_DEFAULT_LOCATION="New York" REMOTE_ADDR="11.222.33.444" SESSION_ID="rstg35tsdf56tdg3" REQUEST_URI="/get/me/something" HTTP_USER_AGENT="Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" REQUEST_METHOD="GET" REWRITTEN_REQUEST_URI="/index.php?url=/get/me/something" STATUS="200" RESPONSE_TIME="155,860ms" PEAK_MEMORY="18965" CPU="99,99"
每个文件的日志为400MB,目前我有大约4GB的日志,因此大小很重要。
另一件事......有两种不同的日志结构(包括不同的列),所以你不能假设总是有相同的列,但你可以假设一次只解析一种结构。
我现在所拥有的是这种结构的正则表达式:
(\\w+)[=][\"](.*?)[\"][ ]{0,1}
我可以使用readlines
,gsub
和read.table
读取数据并以某种方式将其放入数据框中,但速度很慢且很混乱。
有什么想法吗? TNX!
答案 0 :(得分:1)
您可以这样做:
text <- readLines(textConnection(text))
## since we can't use = as splitter (used in url) I create a new splitter
dd <- read.table(text=gsub('="','|"',text),sep=' ')
## use data.table since it is faster to apply operation by columns and bind them again
library(data.table)
DT <- as.data.table(dd)
DT.split <- DT[,lapply(.SD,function(x)
unlist(strsplit(as.character(x) ,"|",fixed=TRUE)))]
DT.split[c(F,T)]