我在目录中有几个文件。他的文件名称包含我想要提取和使用的日期。所有文件都具有相同的名称,但只有日期更改dat_%Y%m%d_sed
:
列出文件:
dir1<- list.files("/data/dat0082009", "*.envi", full.names = TRUE)
提取日期:
date <- as.POSIXct(strptime(basename(dir1), "dat_%Y%m%d_sed", tz =
"GMT"))
output for example:2008-05-10
这工作正常,但我在另一个目录中有其他文件,其中名称中的一部分从一个文件随机更改为另一个文件
示例dat_1254T_%Y%m%d_sed
另一个文件是dat_1172T_%Y%m%d_sed
通常在Linux中我们使用*作为这部分,但我在R中尝试过这样:
dat_*_%Y%m%d_sed
date <- as.POSIXct(strptime(basename(dir1), "dat_*_%Y%m%d_sed", tz = "GMT"))
output: NA
它给了NA所以它没有工作
任何建议请
答案 0 :(得分:1)
您可以使用正则表达式提取日期:
fn <- "dat_1172T_150201_sed"
pat <- "_[^_]+_sed$"
m <- gregexpr(pat, fn)
new_fn <- regmatches(fn,m)[[1]]
现在,您可以在strptime
上应用new_fn
。
答案 1 :(得分:1)
错误可能来自shell通配符与正则表达式特殊字符不同的事实。通配符*
与any string
匹配,而正则表达式字符*
必须与之前的某个表达式一起使用,表示(the expression) 0 or more times
。
因此,您的正则表达式应为"dat_\\d*_%Y%m%d_sed
(\\d
代表数字,如果您可以使用(\\d|\\w)
代替字母。
通配符在list.files
中工作,因为它使用这些参数调用shell函数,但不在strptime
中调用R函数。
编辑事实上,strptime
不接受正则表达式,CathG的解决方案:
as.POSIXct(strptime(gsub('.*_(\\d{8}).*','\\1',basename(dir1)), "%Y%m%d", tz = "GMT"))
说明:gsub
从字符串中提取日期(\\d{8})
,然后strptime
来处理它。