如何处理R中文件名中的随机数字或字母?

时间:2015-02-06 10:38:54

标签: r

我在目录中有几个文件。他的文件名称包含我想要提取和使用的日期。所有文件都具有相同的名称,但只有日期更改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所以它没有工作

任何建议请

2 个答案:

答案 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来处理它。