打开与模式匹配的文件

时间:2014-05-06 17:01:25

标签: regex r filenames

我的文件夹中有以下文件:

Sim_zone_1_TEMP_cell_1_5.ffData
Sim_zone_1_TEMP_cell_1_5.RData
Sim_zone_338_TEMP_cell_338.ffData
Sim_zone_338_TEMP_cell_338.RData

我还有以下细胞载体:

cell <- c(1,5,338)

我想打开我的单元格数与名称匹配的文件。例如,对于我想要的单元格1和5:

ffload("Sim_zone_1_TEMP_cell_1_5")

对于细胞338:

ffload("Sim_zone_338_TEMP_cell_338")

我尝试使用以下代码:

for (i in 1:length(cell) {
  list.files(path = results_wd, 
             pattern=paste("TEMP_cell_",cell[i],"_",sep=""))
  }

它适用于单元号1但不适用于数字5(因为我有cell_1_5而不是cell_5)。我不能只使用&#34; pattern = paste(&#34; _&#34;,cell [i],&#34; _&#34;,sep =&#34;&#34 ;)&#34;因为在&#34; zone&#34;之后我可以有相同的数字。例如,它是TEMP,但它可以是其他东西。

实际上我想要两件事:

  1. 选择_ cell [i] _出现在文件名后的任何位置&#34; cell&#34;
  2. 一旦我有了名字,我想使用ffload(Sim_zone_X_TEMP_cell_X_X),所以删除&#34; .ffdata&#34;或者&#34; .RData&#34;来自名称
  3. 有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

我首先获取文件名(这里我只是将它们写入矢量,但你可以使用list.files),然后我使用gsub()去掉扩展名,然后循环遍历cell并且使用grep()相应匹配匹配文件名。

我在f.names(测试文件名)中添加了一些额外的元素,以确保在我认为您可能遇到的某些情况下匹配不会失败(例如,338不匹配) cell_3381)。

匹配的基本逻辑是在文件名中找到cell[i]中的数字。 cell[i]中的数字被定义为文件名中的数字字符(例如338)的匹配序列,1)(不是立即)前面有“cell”,2)立即前面有一个“_”,3)不是后跟任何数字

f.names <- c("Sim_zone_1_TEMP_cell_1_5.ffData", "Sim_zone_1_TEMP_cell_1_5.RData", "Sim_zone_338_TEMP_cell_338.ffData", "Sim_zone_338_TEMP_cell_338.RData", "Sim_zone_1_TEMP_5_cell_1.RData", "Sim_zone_338_TEMP_cell_338_1.RData", "Sim_zone_338_TEMP_cell_3381.RData", "Sim_zone_338_TEMP_cell_1338.RData", "Sim_zone_338_TEMP_cell_133811.RData") # example file names
# f.names <- list.files(path=results_wd) # to define f.names based on directory contents, use this line instead
f.names.noExt <- gsub("\\.(?:ff|R)Data$", "", f.names, perl=TRUE) # remove extension from file names

cell <- c(1,5,338) # "cell" values through which to cycle

stored.matches <- list() # this will store matching file names (sans extension), each element of the list will contain a vector of names
for(i in 1:length(cell)){
    t.cell <- cell[i] # temporary cell value
    t.pattern <- paste("(?<=cell).*_", t.cell, "(?![0-9])", sep="") # temporary pattern based on t.cell
    t.matches <- grep(t.pattern, f.names.noExt, perl=TRUE, value=TRUE) # temporary matches
    stored.matches[[as.character(t.cell)]] <- t.matches # store the matched names in a list 
}

print(stored.matches)