【发布时间】:2017-10-24 15:46:36
【问题描述】:
我有一些我想阅读和分析的日志文件。不幸的是,这些文件以一种非常“丑陋”的方式保存(中间有很多特殊字符),所以我不能只阅读每一行都是一个条目的行。分隔不同条目的唯一方法是使用正则表达式,因为每个条目的开头都遵循指定的模式。
我的第一种方法是识别字符向量中的模式(我使用 readr-package 中的 read_file),并使用相应的位置通过 strsplit 拆分向量。不幸的是,位置似乎并不总是匹配,因为结果并不总是对应于条目(我猜特殊字符有问题)。
文件的典型行如下所示:
2017 年 16 月 10 日,21:51 - 乔治:这是一个典型的条目
对应的正则表达式如下:
([[:digit:]]{2})/([[:digit:]]{2})/([[:digit:]]{4}), ([[:digit:]]{2}):([[:digit:]]{2}) - ([[:alpha:]]+):
我想要的第一件事是一个 data.frame,其中每一行对应一个特定的条目(在下一步中,我会将模式分成不同的部分)。
到目前为止,我尝试了以下内容:
regex.log = "([[:digit:]]{2})/([[:digit:]]{2})/([[:digit:]]{4}), ([[:digit:]]{2}):([[:digit:]]{2}) - ([[:alpha:]]+):"
log.regex = gregexpr(regex.log, file.log)[[1]]
log.splitted = substring(file.log, log.regex, log.regex[2:355]-1)
可以看出,这个日志文件有 355 个条目。第一个被正确分开。如何在不丢失正则表达式/模式信息的情况下使用正则表达式分隔字符向量?
【问题讨论】:
-
我想你想使用
grepl(regex.log, file.log)的组合来识别匹配的行和gsub(regex.log,"", file.log)来提取文本。