从长文件名中提取日期

时间:2017-03-19 23:09:25

标签: r regex extract filenames

我已经阅读了一些关于从文件名中提取日期(或不同部分)的其他问题,但我似乎无法获得任何其他答案来处理我的文件名。 我有一个目录中的> 15,000个文件名列表,我需要从文件名中提取日期,以便我可以找出我错过的日期(我应该总共有15,706个,但在某些目录中。我只有〜 15600)

这是一个例子

maxTemps <- list.files("./Daily/Daily_TMax/", recursive = TRUE, pattern = ".asc$", full.names = FALSE)
length(maxTemps)
[1] 15697

head(maxTemps)
[1] "1970/eMAST_ANUClimate_day_tmax_v1m0_19700101.asc" "1970/eMAST_ANUClimate_day_tmax_v1m0_19700102.asc"
[3] "1970/eMAST_ANUClimate_day_tmax_v1m0_19700103.asc" "1970/eMAST_ANUClimate_day_tmax_v1m0_19700104.asc"
[5] "1970/eMAST_ANUClimate_day_tmax_v1m0_19700105.asc" "1970/eMAST_ANUClimate_day_tmax_v1m0_19700106.asc"

tail(maxTemps)
[1] "2012/eMAST_ANUClimate_day_tmax_v1m0_20121226.asc" "2012/eMAST_ANUClimate_day_tmax_v1m0_20121227.asc"
[3] "2012/eMAST_ANUClimate_day_tmax_v1m0_20121228.asc" "2012/eMAST_ANUClimate_day_tmax_v1m0_20121229.asc"
[5] "2012/eMAST_ANUClimate_day_tmax_v1m0_20121230.asc" "2012/eMAST_ANUClimate_day_tmax_v1m0_20121231.asc"

我已经能够使用以下代码获取年份(基于文件夹)

regmatches(maxTemp, regexpr("[0-9]{4}", maxTemp))

我以为我可以使用invert = TRUE来返回其余字符串,因为如果我尝试在regexpr中包含文件名的常量部分我会收到错误

maxTempsFiles <- regmatches(maxTemp, regexpr("[0-9]{4}\/(eMAST_ANUClimate_day_tmax_v1m0_)", maxTemp), invert = TRUE)
Error: '\/' is an unrecognized escape in character string starting ""[0-9]{4}\/"

所以我认为我可以使用有效的代码,然后将文件名的常量部分子集化,留下我的日期,然后我只需要用sub删除.asc,但这会返回一些凌乱的文字

maxTempsFiles <- regmatches(maxTemp, regexpr("[0-9]{4}", maxTemp), invert = TRUE)
maxTempsFiles <- sub(x = maxTempsFiles, pattern = "/eMAST_ANUClimate_day_tmax_v1m0_", replacement = "")
maxTempsFiles <- sub(x = maxTempsFiles, pattern = ".asc", replacement = "")
head(maxTempsFiles)
[1] "c(\"\", \"19700101\")" "c(\"\", \"19700102\")" "c(\"\", \"19700103\")" "c(\"\", \"19700104\")" "c(\"\", \"19700105\")"
[6] "c(\"\", \"19700106\")"

文件中始终包含/eMAST_ANUClimate_day_prec_v1m0_,它只是第一个更改的文件夹,文件名19700101.asc20121231.asc的结尾

如果有人可以就如何做到这一点提供一些代码/建议,那就太棒了。

1 个答案:

答案 0 :(得分:1)

这是一个简单的搜索使用组的字符串的部分匹配 - 并返回组中所需的匹配。

gsub("(^.*_)(\\d+)\\.asc$", "\\2", x)

正则表达式解释:

group 1:
  (^.*_) - match beginning of string (^) and then any character until _ is found
group 2:
  (\\d+) - find any digit, several times (+)
no group:
  \\.asc$ - at last, find .asc, which should be the end of the string ($)
replacement中的

gsub参数用于替换字符串的匹配部分,或者返回所需的组。对于第2组,您需要\\2subgsub之间的区别在于,前者只返回第一个匹配的模式,而gsub将对整个矢量起作用。