1

我想解析 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,但它很慢而且很混乱gsubread.table

有任何想法吗?天呐!

4

1 回答 1

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)]
于 2013-08-05T15:36:32.183 回答