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 のログがあるため、サイズが重要です。

別のこと.. 2 つの異なるログ構造 (異なる列が含まれる) があるため、常に同じ列を持つとは想定できませんが、一度に解析されるのは 1 種類の構造のみであると想定できます。

私が今まで持っているのは、この構造の正規表現です:

(\\w+)[=][\"](.*?)[\"][ ]{0,1}

readlinesを使用しgsubてデータを読み込んでデータフレームに収めることはできますが、read.table遅くて面倒です。

何か案は?Tnx!

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 に答える