Лучший метод для преобразования данных файла журнала для анализа с использованием R или Python

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

вещи, с которыми я столкнулся, пытаясь найти решение этой проблемы. 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. Каждая запись начинается с M и заканчивается на E

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

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

  [1]: https://stackru.com/images/96aa1433b3a6a0413b5643992ef8c7d1062e5a1c.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)

1 ответ

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

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

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

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

Другие вопросы по тегам