繁体   English   中英

将access.log解析为data.frame

[英]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}

我可以使用readlinesgsubread.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM