首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将伪HTML/XML日志文件解析为数据框架(Symantec Altiris) [R]

将伪HTML/XML日志文件解析为数据框架(Symantec Altiris) [R]
EN

Stack Overflow用户
提问于 2014-08-06 20:04:11
回答 1查看 83关注 0票数 0

我被要求帮助解析Symantec应用程序(Altiris)的一些日志文件,它们以伪HTML/XML格式交付给我。我成功地使用了readLines()grepl()将日志转换成一个良好的字符向量格式,并清除了垃圾,但无法将其放入数据帧中。

到目前为止,一个条目看起来像这样(因为我不能发布真实的数据),所有的条目都在一个带有结构chr[1:312]的字符向量中

代码语言:javascript
复制
[310] "<severity='4', hostname='computername125', source='PackageDownload', module='herpderp.dll', process='masterP.exe', pid='234' >"

我在XML解析方面没有任何进展,在我看来,它更像HTML,当我尝试htmlTreeParse(x)时,我最终得到了一个庞大的标签金字塔。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-06 20:49:23

如果您使用的是伪XML,最好自己定义解析规则。我喜欢stringrdplyr这样的东西。

下面是一个双元素向量(而不是在您的例子中是312 ):

代码语言:javascript
复制
vec <- c(
  "<severity='4', hostname='computername125', source='PackageDownload', module='herpderp.dll', process='masterP.exe', pid='234' >",
  "<severity='5', hostname='computername126', source='PackageDownload', module='herpderp.dll', process='masterP.exe', pid='235' >"
)

将其转换为data.frame对象:

代码语言:javascript
复制
df <- data.frame(vec, stringsAsFactors = FALSE)

并根据它们的字符索引位置(相对于您感兴趣的变量的位置)选择数据:

代码语言:javascript
复制
require(stringr)
require(dplyr)

df %>%
  mutate(
    severityStr = str_locate(vec, "severity")[, "start"],
    hostnameStr = str_locate(vec, "hostname")[, "start"],
    sourceStr = str_locate(vec, "source")[, "start"],
    moduleStr = str_locate(vec, "module")[, "start"],
    processStr = str_locate(vec, "process")[, "start"],
    pidStr = str_locate(vec, "pid")[, "start"],
    endStr = str_locate(vec, ">")[, "start"],
    severity = substr(vec, severityStr + 10, hostnameStr - 4),
    hostname = substr(vec, hostnameStr + 10, sourceStr - 4),
    source = substr(vec, sourceStr + 8, moduleStr - 4),
    module = substr(vec, moduleStr + 8, processStr - 4),
    process = substr(vec, processStr + 9, pidStr - 4),
    pid = substr(vec, pidStr + 5, endStr - 3)) %>%
  select(severity, hostname, source, module, process, pid)

下面是生成的数据框架:

代码语言:javascript
复制
  severity        hostname          source       module     process pid
1        4 computername125 PackageDownload herpderp.dll masterP.exe 234
2        5 computername126 PackageDownload herpderp.dll masterP.exe 235

该解决方案足够健壮,可以处理不同长度的字符串输入。例如,即使pid95 (两位而不是三位),它也会正确地读取它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25169185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档