缩进无序列表到嵌套列表()

时间:2017-12-10 03:50:25

标签: r list parsing

我有一个日志文件,如下所示:

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'))))

这样做有一种非常痛苦的方法吗?

1 个答案:

答案 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。您需要在较大的文件上测试它,并在必要时更改替换。