2013-08-05 4 views
1

Я хочу, чтобы разобрать access.log в R. Он имеет следующий вид, и я хочу, чтобы получить его в data.frame:разборе 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 на файл, и в настоящее время у меня около 4 ГБ журналов, поэтому размер имеет значение.

Другое дело. Существуют две разные структуры журналов (в них включены разные столбцы), поэтому вы не можете предполагать, что они имеют одинаковые столбцы, но вы можете предположить, что одновременно анализируется только один вид структуры.

То, что я до сих пор является регулярное выражение для этой структуры:

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

Я могу прочитать данные и каким-то образом вписать его в dataframe с использованием readlines, gsub и read.table, но это медленно и неаккуратно.

Любые идеи? Tnx!

ответ

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)] 
+0

В HTTP_USER_AGENT у вас есть пробелы, так что это не будет работать – Alan

+0

@frinx Нет это не работает для меня. пробелы между кавычками, поэтому он не будет обнаружен 'read.table'. – agstudy

+0

true .. tnx, позвольте мне попробовать – Alan

Смежные вопросы