我有一个日志文件,如下所示:
Data:
+datadir=/data/2017-11-22
+Nusers=5292
Parameters:
+outdir=/data/2017-11-22/out
+K=20
+IC=179
+ICgroups=3
-group 1: 1-1
ICeffects: 1-5
-group 2: 2-173
ICeffects: 6-10
-group 3: 175-179
ICeffects: 11-15
我想使用R将此日志文件解析为嵌套列表,以便结果如下所示:
result <- list(Data = list(datadir = '/data/2017-11-22',
Nusers = 5292),
Parameters = list(outdir = '/data/2017-11-22/out',
K = 20,
IC = 179,
ICgroups = list(list('group 1' = '1-1',
ICeffects = '1-5'),
list('group 2' = '2-173',
ICeffects = '6-10'),
list('group 1' = '175-179',
ICeffects = '11-15'))))
这样做有一种非常痛苦的方法吗?
答案 0 :(得分:2)
免责声明:这很麻烦。如果不进行一些调整,无法保证这适用于较大/不同的文件。您需要仔细检查。
这里的关键思想是重新格式化原始数据,使其与YAML格式保持一致,然后使用yaml::yaml.load
解析数据以生成嵌套列表。
顺便说一句,这是一个很好的例子,说明为什么一个人应该使用通用标记语言来存储日志输出/配置文件(如JSON,YAML等)......
我假设您使用readLines
读取日志文件以生成字符串ss
的向量。
# Sample data
ss <- c(
"Data:",
" +datadir=/data/2017-11-22",
" +Nusers=5292",
"Parameters:",
" +outdir=/data/2017-11-22/out",
" +K=20",
" +IC=179",
" +ICgroups=3",
" -group 1: 1-1",
" ICeffects: 1-5",
" -group 2: 2-173",
" ICeffects: 6-10",
" -group 3: 175-179",
" ICeffects: 11-15")
然后我们重新格式化数据以符合YAML格式。
# Reformat to adhere to YAML formatting
ss <- gsub("\\+", "- ", ss); # Replace "+" with "- "
ss <- gsub("ICgroups=\\d+","ICgroups:", ss); # Replace "ICgroups=3" with "ICgroups:"
ss <- gsub("=", " : ", ss); # Replace "=" with ": "
ss <- gsub("-group", "- group", ss); # Replace "-group" with "- group"
ss <- gsub("ICeffects", " ICeffects", ss); # Replace "ICeffects" with " ICeffects"
请注意 - 与预期输出一致 - 来自3
的{{1}}值未被使用,我们需要将ICgroups
替换为ICgroups=3
以启动嵌套子列表。这是让我先离开的部分......
装载&amp;解析YAML字符串然后生成嵌套列表。
ICgroups:
PS。您需要在较大的文件上测试它,并在必要时更改替换。