【问题标题】:make file.exists() case insensitive使 file.exists() 不区分大小写
【发布时间】:2020-06-03 18:38:24
【问题描述】:

我的脚本中有一行代码检查文件是否存在(实际上,很多文件,这一行会循环用于一堆不同的文件):

file.exists(Sys.glob(file.path(getwd(), "files", "*name*")))

这将查找目录 /files/ 中包含“名称”的任何文件,例如“文件名.csv”。但是,我的一些文件被命名为“fileName.csv”或“thisfileNAME.csv”。他们没有得到认可。如何使 file.exists 以不区分大小写的方式处理此检查?

在我的其他代码中,我通常使用 tolower 函数将任何导入的名称或列表立即变为小写。但我没有看到任何将其包含在 file.exists 函数中的选项。

【问题讨论】:

  • 基于file.exists 文档,看起来这是基于底层操作系统特定的功能:“不区分大小写的文件系统不区分大小写的文件系统是 Windows 和 macOS 上的规范,但可以可以在所有操作系统上找到(例如,FAT 格式的 USB 驱动器可能不区分大小写)。这些函数很可能匹配现有文件,无论此类文件系统上的大小写如何:但是这是一个操作系统函数,文件名可能可能映射为大写或小写。”
  • 您可以遍历list.files 的返回值(使用tolower 时)并检查文件是否存在...

标签: r case-insensitive file-exists


【解决方案1】:

使用list.files的建议解决方案:

如果我们有很多文件,我们可能只想这样做一次,否则我们可以放入函数中(并将path_to_root_directory而不是found_files传递给函数)

  found_files <- list.files(path_to_root_directory, recursive=FALSE)

行为为file.exists(返回值为布尔值):

  fileExIsTs <- function(file_path, found_files) {
    return(tolower(file_path) %in% tolower(found_files))
  }

返回值是在目录中找到拼写的文件,如果不匹配,则返回character(0)

  fileExIsTs <- function(file_path, found_files) {
    return(found_files[tolower(found_files) %in% tolower(file_path)])
  }

编辑:

满足新要求的新解决方案:

keywordExists <- function(keyword, found_files) {
  return(any(grepl(keyword, found_files, ignore.case=TRUE)))
}

keywordExists("NaMe", found_files=c("filename.csv", "morefilenames.csv"))

返回:

[1] TRUE

或者
返回值是在目录中找到的拼写文件,如果不匹配,则返回 character(0)

keywordExists2 <- function(file_path, found_files) {
  return(found_files[grepl(keyword, found_files, ignore.case=TRUE)])
}

keywordExists2("NaMe", found_files=c("filename.csv", "morefilenames.csv"))

返回:

[1] "filename.csv"      "morefilenames.csv"

【讨论】:

  • 感谢您的回答,您的功能似乎需要相同的匹配才能工作。我需要知道文件名是否包含字符串、小写或大写。所以如果我正在测试“name”,我需要为“filename.csv”、“morefilenames.csv”等获取 TRUE。
  • 那么你的问题不是文件名的小写或大写,而是你想匹配 any 包含字符串的文件名?!你只需要一个 TRUE 或 FALSE 还是你想要 all 匹配的列表? (见我上面的编辑)
【解决方案2】:

如果文件名在任何情况下都匹配,则以下内容应返回 1,否则应返回 0。

max(grepl("*name*",list.files()),ignore.case=T)

【讨论】:

  • 我正在专门寻找大小写 insensitive 匹配。
猜你喜欢
  • 2011-09-24
  • 2013-04-17
  • 2012-12-01
  • 2013-03-06
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多