Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将无序列表缩进嵌套列表()_R_List_Parsing - Fatal编程技术网

R 将无序列表缩进嵌套列表()

R 将无序列表缩进嵌套列表(),r,list,parsing,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

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

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

result免责声明:这太乱了。如果不进行一些调整,无法保证这将适用于较大/不同的文件。你需要做一些仔细的检查

这里的关键思想是重新格式化原始数据,使其与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")

另外,您需要在较大的文件上进行测试,并在必要时对替换进行更改。

聪明!是的,我仍然被
ICgroups
绊倒,所以如果你有一个简单的解决方案,那就太多了appreciated@RoyalTS我现在可以解析您提供的完整示例数据,请查看我的更新解决方案。这很可能需要对较大/不同的日志文件进行一些调整,但这是我能想到的最好方法。另一种方法是编写自己的解析器。。。
# 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"
require(yaml);
lst <- yaml.load(paste(ss, collapse = "\n"));
lst;

#$Data
#$Data[[1]]
#$Data[[1]]$datadir
#[1] "/data/2017-11-22"
#
#
#$Data[[2]]
#$Data[[2]]$Nusers
#[1] 5292
#
#
#
#$Parameters
#$Parameters[[1]]
#$Parameters[[1]]$outdir
#[1] "/data/2017-11-22/out"
#
#
#$Parameters[[2]]
#$Parameters[[2]]$K
#[1] 20
#
#
#$Parameters[[3]]
#$Parameters[[3]]$IC
#[1] 179
#
#
#$Parameters[[4]]
#$Parameters[[4]]$ICgroups
#$Parameters[[4]]$ICgroups[[1]]
#$Parameters[[4]]$ICgroups[[1]]$`group 1`
#[1] "1-1"
#
#$Parameters[[4]]$ICgroups[[1]]$ICeffects
#[1] "1-5"
#
#
#$Parameters[[4]]$ICgroups[[2]]
#$Parameters[[4]]$ICgroups[[2]]$`group 2`
#[1] "2-173"
#
#$Parameters[[4]]$ICgroups[[2]]$ICeffects
#[1] "6-10"
#
#
#$Parameters[[4]]$ICgroups[[3]]
#$Parameters[[4]]$ICgroups[[3]]$`group 3`
#[1] "175-179"
#
#$Parameters[[4]]$ICgroups[[3]]$ICeffects
#[1] "11-15"