我想将日志文件转换为可在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
............................................................................
底层结构是这样的;
每条记录以M开头,以E
D是提供有关单条记录的更多信息的变量。 因此,如上面的日志文本所示,第一个例子是M以E结尾,并且在D之间提供诸如相关ID,连接ID等信息。
因此,上面的日志文件应该是数据表格式中的一行,并且D' s作为变量。
[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 :(得分: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,则根据存在的其他信息将数据添加到当前记录中。
这不会太容易,但也不会太难。从一条记录开始,创建大量的中间变量并在当时采取一个步骤。