复制梦night,根据另一个文件夹中的文件选择要复制的文件

时间:2018-12-16 12:46:34

标签: r copying

使用copy.file有点问题。

我需要根据另一个文件目录中文件的名称,从具有几个子目录(.tif文件所在的目录)的目录中复制.tif文件。我有以下代码(几乎可以运行)

ValidatedDirectory <- "C:/Users/JS22/Desktop/R_Experiments/Raw_Folder_Testa/Validated"
RawDirectory <- "C:/Users/JS22/Desktop/R_Experiments/Raw_Folder_Testa/Raw"
OutputDirectory <- "C:/Users/JS22/Desktop/R_Experiments/Raw_Folder_Testa/Ouputfolder"

ValidatedImages <- list.files(ValidatedDirectory)


# this is to remove the extra bit that is added onto the validated images [working]
pattern <- gsub("_hc", "", ValidatedImages) 
pattern <- paste(gsub("([.|()\\^{}+$*?]|\\[|\\])", "\\\\\\1", pattern), collapse="|")

# this bit tackles finding the relevant files based on the ValidatedImages
filesinRAW <- list.files(
  path = RawDirectory,
  recursive = TRUE,
  include.dirs = FALSE,
  full.names = FALSE)
filesinRAW <- as.list(filesinRAW)

# this removes subdirectory prefix in front of the file and .tif which confuses it
filesinRAW <- as.list(gsub("\\d\\d\\d\\d/", "", filesinRAW)) 
filesinRaw <- as.list(gsub(".tif", "", filesinRAW))

tocopy <- grep(filesinRAW, pattern = pattern, value = TRUE)
tocopy <- as.list(tocopy)
tocopy <- as.list(gsub(".tif", "", tocopy))

setwd(RawDirectory)

file.copy(from = tocopy, to = OutputDirectory, overwrite = TRUE)

我收到No such file or directory错误,文件确实存在(显然),因此我在命名上一定做错了。

我已经花了很长时间了,如果有帮助,我可以上传示例数据并共享链接。

感谢任何帮助社区!

2 个答案:

答案 0 :(得分:2)

在调试时,请尝试分解代码,以查看每个步骤中的变量是否仍然符合您的期望。

也就是说,我现在在您的代码中看到了几个问题:

  • grep使用pattern作为长度为一的正则表达式。如果为它提供多个正则表达式,它将使用第一个(带有警告,如果禁用了它们,则不会显示警告)。
    要使用多个匹配项,可以使用applysapplyfilesinRAW[apply(sapply(pattern, grepl, x=filesinRAW), 2, any)]。但是请看最后一点
  • 默认情况下,
  • grep使用pattern作为正则表达式,如果您的pattern包含已解析的字符,则这可能会破坏事情。例如,grep('^test', '^test')给出零结果。要检查字符串是否包含文字字符串,可以使用grep(..., fixed=TRUE)
  • 在最后一步中,您使用sub(".tif", "", to copy),它将删除任何样式,例如.tif。我想您打算在末尾再次 add .tif,现在您正在尝试复制没有扩展名的文件,但找不到扩展名。要添加,可以使用paste
  • 在几个步骤中,您将使用as.list。为什么?在R中,所有内容都是矢量化的,这意味着已经使用了多个值。列表和向量之间的区别在于列表可以存储不同类型的对象,但是您还是不会这样做。据我所知,as.lists并没有任何害处,因为所有功能都将首先将您的列表转换回字符向量。
  • 最后,据我所知,您首先在列出需要复制的文件名(pattern),然后将其与文件的完整列表进行比较。然后您尝试使其完全匹配。那为什么要使用正则表达式呢?如果只知道文件名的一部分,那么正则表达式就很有用,但这是您的目标。例如。如果filename1._hc在您的ValidatedDirectory中,是否还需要复制文件filename11.tiffilename12.tif? 如果您只是在寻找完全匹配的内容,则可以直接进行比较:
    tocopy <- tocopy[tocopy %in% pattern]

但是通常,在R中工作很容易,因为您可以逐步进行所有操作,并且如果您仅检查tocopy,就可以看到您的通话是否有意义。

答案 1 :(得分:0)

在@Emil Bode的大力帮助下,我对这个问题有以下解决方案(也许不是最优雅的方法,但是它可以在数千个.tif文件上运行得足够快。

ValidatedDirectory <- "C:/Users/JS22/Desktop/R_Experiments/Raw_Folder_Testa/Validated"
RawDirectory <- "C:/Users/JS22/Desktop/R_Experiments/Raw_Folder_Testa/Raw"
OutputDirectory <- "C:/Users/JS22/Desktop/R_Experiments/Raw_Folder_Testa/Ouputfolder"

ValidatedImages <- list.files(ValidatedDirectory)

pattern <- gsub("_hc", "", ValidatedImages)
pattern <- paste(gsub("([.|()\\^{}+$*?]|\\[|\\])", "\\\\\\1", pattern), collapse="|")

filesinRAW <- list.files(
  path = RawDirectory,
  recursive = TRUE,
  include.dirs = FALSE,
  full.names = FALSE,
  pattern = pattern)

setwd(RawDirectory)

file.copy(from = filesinRAW, to = OutputDirectory, overwrite = TRUE)