#> $`Exam date:` #> [1] " 2020-01-01 15:38" #> #> $-6ren">
gpt4 book ai didi

将 txt 文件读入列表,其中每个列表元素由以冒号结尾的行分隔

转载 作者:行者123 更新时间:2023-12-04 08:09:57 25 4
gpt4 key购买 nike

我有以下 .txt 结构

test <- "A n/a:
4001
Exam date:
2020-01-01 15:38
Pos (deg):
18.19
18.37"
我想将其读入一个列表,其中每个列表元素都以冒号结尾的行名称给出,值由以下行给出。 (见:预期输出)。
挑战
行数(每个列表元素的长度)可以不同。可以有特殊字符(例如,“A n/a”),并且有包含讨厌的冒号的日期时间值。
我的问题
我当前的解决方案( 见下文 )是不安全的,因为我不能确定我有所有预期元素的完整列表 - 该文件可能包含我不会捕获的意外列表元素,或者更糟的是,它们会弄乱整个数据。
我试过的
  • 我尝试使用 jsonlite::fromJson 将 txt 读取到 json ,因为结构在某种程度上类似于它,但这给出了一个关于意外字符的错误。
  • 我试图读入一个字符串并进行拆分,但这让我再次将所有值都放在一个列表元素中:
  • readr::read_file(test)
    strsplit(test, split = ":\n")
  • 我目前的做法 是用 read.csv2 读取它并在(预期的)行名称上生成查找,创建一个用于拆分的向量并使用结果列表的第一个元素进行命名。

  • myfile <- read.csv2(text = test,
    header = FALSE)
    lu <- paste(c("A n", "date", "Pos"), collapse = "|")

    ls_file <- split(myfile$V1, cumsum(grepl(lu, myfile$V1, ignore.case = TRUE)))
    names(ls_file) <- unlist(lapply(ls_file, function(x) x[1]))
    ls_file <- lapply(ls_file, function(x) x <- x[2:length(x)])

    ## expected output is a named list
    ## The spaces and backticks below do not really bother me,
    ## but I would get rid of them in a next step.

    ls_file
    #> $`A n/a:`
    #> [1] " 4001"
    #>
    #> $`Exam date:`
    #> [1] " 2020-01-01 15:38"
    #>
    #> $`Pos (deg):`
    #> [1] "18.19" "18.37"

    最佳答案

    假设每个元素的名称以 : 结尾,那么我们可以:

    res <- readLines(textConnection(test))
    res <- split(res, cumsum(endsWith(res, ':')))
    res <- setNames(lapply(res, `[`, -1), sapply(res, `[`, 1))
    # > res
    # $`A n/a:`
    # [1] " 4001"
    #
    # $`Exam date:`
    # [1] " 2020-01-01 15:38"
    #
    # $`Pos (deg):`
    # [1] "18.19" "18.37"

    关于将 txt 文件读入列表,其中每个列表元素由以冒号结尾的行分隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66027976/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com