2017-07-01 89 views
0

數值我有包含以下行(或類似)的文本文件:提取從文本

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]+$")) 

    } 
+0

什麼是你想要的輸出完全是一個文件夾? – janos

+0

-873.1421319 Thx – Ism45

回答

0
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來提取數字部分。

2

您想提取-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]+)?') 
0

編輯,以顯示完整的代碼

當你在遍歷多個文件,你需要做些什麼來防止值被覆蓋每個循環。一個選項是使用一個列表。如果你想把結果作爲一個向量,你可以使用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