[英]parsing access.log to data.frame
我想解析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
读取数据,并以某种方式使其适合数据readlines
,但它速度慢且混乱。
有任何想法吗? TNX!
您可以这样做,例如:
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)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.