【问题标题】:Opening files that match a pattern打开与模式匹配的文件
【发布时间】:2014-05-06 17:01:25
【问题描述】:

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

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)。我不能只使用 "pattern=paste(" _ ",cell[i]," _ ",sep="")" 因为我可以在 "zone" 之后使用相同的数字。例如,它是 TEMP,但也可以是其他东西。

其实我想要两件事:

  1. 选择_cell[i]_出现在“cell”之后的任意位置的文件名
  2. 一旦有了我想使用的名称 ffload(Sim_zone_X_TEMP_cell_X_X),请从名称中删除“.ffdata”或“.RData”

有人可以帮我吗?

【问题讨论】:

    标签: regex r filenames


    【解决方案1】:

    我首先获取文件名(这里我只是将它们写入向量,但您可以使用 list.files),然后使用 gsub() 去除扩展名,然后循环通过 cell 并匹配匹配文件名相应地使用grep()

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

    匹配的基本逻辑是在文件名中找到cell[i]中的数字。 cell[i] 中的数字被定义为文件名中数字字符(例如 338)的匹配序列,其中 1) (不立即)前面是“单元格”,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)
    

    【讨论】:

    • 效果很好,非常感谢
    猜你喜欢
    • 2015-06-14
    • 1970-01-01
    • 2011-01-11
    • 2015-09-21
    • 2017-02-23
    • 1970-01-01
    • 2010-09-17
    • 2012-01-21
    • 1970-01-01
    相关资源
    最近更新 更多