2015-02-12 12 views
0

Я хочу преобразовать файлы журнала в формат, который можно прочитать в R для дальнейшего анализа.Лучший способ преобразования данных файла журнала для анализа с использованием R или python

вещи, на которые я столкнулся, пытаясь найти решение этого. Regex, RecordBreaker, OpenRefine или GoogleRefine, R имеет stringr и dplyr и т. Д.

Я попытался использовать OpenRefine, и мне показалось полезным, но все же хотелось бы иметь больше рекомендаций, так как они говорят, что файлы журналов являются настоящими большими данными.

Данные выглядят следующим образом:

M 8000000 NADR  14273 18:17:43.22 STC35256 00000291 DSNT375I +HPN2 PLAN=DISTSERV WITH 026 
D           026 00000291   CORRELATION-ID=db2jcc_appli 
D           026 00000291   CONNECTION-ID=SERVER 
D           026 00000291   LUW-ID=G93FF023.DB11.CDD5C8DE241F=29839 
D           026 00000291 
D           026 00000291 THREAD-INFO=SAPHPNDB:9.63.240.123:SAPHPNDB:db2jcc_application:DYNAMIC 
D           026 00000291 :46835:*:* 
D           026 00000291   IS DEADLOCKED WITH PLAN=DISTSERV WITH 
D           026 00000291   CORRELATION-ID=db2jcc_appli 
D           026 00000291   CONNECTION-ID=SERVER 
D           026 00000291   LUW-ID=G93FF07C.EE5F.CDD5C82B2305=29799 
D           026 00000291 
D           026 00000291 THREAD-INFO=SAPHPNDB:9.63.240.33:SAPHPNDB:db2jcc_application:DYNAMIC: 
D           026 00000291 46835:*:* 
E           026 00000291   ON MEMBER HPN2 
............................................................................ 

Основная структура такова:

  1. Каждая запись начинается с М и заканчивается Й

  2. В отеле D's являются переменными, которые дают больше информации об одной записи. Таким образом, первый экземпляр этого, как показано в тексте журнала выше, начинается с М заканчивается Е и между предоставить информацию о двойки, такие как корреляции ID, идентификатор соединения и т.д.

Так выше файла журнала должна быть одной строкой в ​​формате таблицы данных с D в качестве переменных.

[1]: http://i.stack.imgur.com/hw9zY.png 

Возможное решение:

data <- readLines("data1.txt") 
pattern <- "(M\\s+\\d+\\s+)(\\w+\\s+)(\\d+\\s+)(\\d+:\\d+:\\d+.\\d+\\s+)(\\w+\\s+)(\\d+\\s+)(\\w+\\s+)(\\+\\w+\\s+\\w+(\\=|\\s+)\\w+\\s+\\w+\\s+\\d+)" 

m <- regexec(pattern,data) 

matches <- regmatches(data, m) 

parts <- do.call(rbind,lapply(regmatches(data, m), `[`,c(2L,3L,4L,5L,6L,7L,8L,9L))) 

colnames(parts) <- c("ID1","ID2","Date","Time","ID3","ID4","ID5","description") 

parts <- as.data.frame(parts) 

parts1 <- na.omit(parts) 
+0

Является ли общий набор D предопределенным? В противном случае, как вы представляете себе сопоставление различных D's с переменными? – LauriK

+0

Его не предопределено, он меняется, есть макс. переменных, которые могли бы произойти, и было бы много случаев, когда их было бы подмножество. например. Таким образом, идентификатор корреляции будет столбцом, но в фрагменте, где идентификатор корреляции не генерируется в журнале, тогда мы должны иметь NA. – vinay

ответ

0

Ну, вы могли бы сделать это один лог строки в то время. Псевдокод будет примерно таким:

IF logrow.record == 'D' AND logrow.type == 'CORRELATION' THEN 
    current.record$correlation = logrow.value 
ELSE IF logrow.record == 'E' THEN 
    all.records[n+1] = current.record 
ELSE IF logrow.record == 'M' THEN 
    current.record = empty new record 
    current.record$ID = logrow.value 
END 

В принципе, если это M, то вы начинаете новую запись. Если это E, вы завершаете текущий. И если это D, добавьте данные в текущую запись, основываясь на другой информации.

Это не будет слишком легко, но не слишком сложно. Начните с одной записи, создайте хорошее количество промежуточных переменных и сделайте один шаг в то время.