【问题标题】:Extract a numerical value from text从文本中提取数值
【发布时间】:2017-07-01 05:34:43
【问题描述】:

我有包含以下行(或类似行)的文本文件:

178487\ASF=-873.1421319\NFGH=540.56201\PG=C01

如何使用 R 提取 ASF= 之后的值?

我已经开始了:


library(stringr)
file_list <- list.files(pattern = "*.txt")
for (i in 1:length(file_list)) {
  mydataFrame = readLines(file_list[i])
  value1 <- grep("ASF=", mydataFrame, value = TRUE)
  value2 <- as.numeric(str_extract(value1,"[0-9]+$"))  

  }

【问题讨论】:

  • 你想要的输出到底是什么?
  • -873.1421319 谢谢

标签: r


【解决方案1】:

您想提取-873.1421319 跟在\ASF= 之后, 例如来自字符串:178487\ASF=-873.1421319\NFGH=540.56201\PG=C01

你使用的模式[0-9]+$不正确,原因有很多:

  • $ 匹配字符串的结尾。此模式将匹配示例字符串中的 01,因为那是它末尾的数字序列。
  • 模式[0-9]+ 将匹配一个非空的数字序列。它不包括-.

因此您需要删除$,并改进模式以考虑-.,例如:-?[0-9]+(\\.[0-9]+)?

不过,这还是够了, 因为你只想要\ASF=后面的数字, 但不包括 \ASF= 本身在比赛中。 为此,您需要使用积极的后视:

library(stringr)
str_extract(s, '(?<=\\\\ASF=)-?[0-9]+(\\.[0-9]+)?')

【讨论】:

    【解决方案2】:
    library(stringr)
    file_list <- list.files(pattern = "*.txt")
    for (i in 1:length(file_list)) {
        mydataFrame = readLines(file_list[i])
        for (line in mydataFrame) {
            elems <- unlist(strsplit(line, split = "\\\\"))
            value <- as.numeric(str_extract(elems[2], "[+|-][0-9]*\\.?[0-9]*"))
        }
    }
    

    首先,字符串拆分为\,第二个字段是 ASF 及其关联值。然后,您现在可以使用 str_extract 提取数字部分。

    【讨论】:

      【解决方案3】:

      编辑显示完整代码

      当您循环多个文件时,您需要做一些事情来防止值在每个循环中被覆盖。一种选择是使用列表。如果您希望将结果作为一个向量,您可以改用c

      file_list <- list.files(pattern = "*.txt")
      # Initialise empty list
      value <- list()
      for (i in 1:length(file_list)) {
        mydataFrame = readLines(file_list[i])
        value[[i]] <- as.numeric(sub(".*ASF=(-[0-9]+\\.[0-9]+).*$","\\1",mydataFrame))
      }
      

      请注意,您无需先调用grep,然后再调用sub。只需sub

      我在一个包含两个文本文件的文件夹上测试了这个

      > value
      [[1]]
      [1] -873.1421 -823.1421 -813.1421
      
      [[2]]
      [1] -573.1421 -223.1421 -713.1421
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多