【问题标题】:Importing files into R if filename matches specified criteria如果文件名符合指定条件,则将文件导入 R
【发布时间】:2026-01-26 13:10:01
【问题描述】:

如果文件名包含特定字符串,我正在尝试使用 R 循环导入 csv 文件

例如,我有一个名称为“file01042016_abc.csv”、“file020142016_abc.csv”、“file03042016_abc.csv”...“file26092019_abc.csv”的文件列表,并且我有一个格式为特定值的列表'01042016'、'05042016'、'09042016'等

如果文件名包含第二个列表中的字符串值,我只想导入文件。

我可以完全导入它们(如下所示),但是有几千个文件并且需要相当长的时间,因此希望通过仅导入基于上述条件所需的文件来减少它。

files <- list.files(path)

for (i in 1:length(files)) {

  assign(paste("Df", files[i], sep = "_"), read.csv(paste(path, files[i], sep='')))

}

任何帮助/建议将不胜感激。谢谢。

【问题讨论】:

    标签: r string csv import


    【解决方案1】:

    将正则表达式与grepl 一起使用:

    files <- list.files(path)
    formats <- c("01042016", "05042016", "09042016")
    regex <- paste(formats, collapse="|")
    
    sapply(files, function(x) {
        if (grepl(regex, x)) {
            assign(paste("Df", x, sep = "_"), read.csv(paste(path, x, sep='')))
        }
    })
    

    这里的策略是生成一个包含所有数字文件名片段的单个正则表达式替换,这会将文件列入白名单作为要读取的候选者。对于上面给出的示例数据,regex 将变为:

    01042016|05042016|09042016
    

    然后,我们在每个文件上调用 grepl 以查看它是否与列入白名单的模式之一匹配。请注意,我切换到使用 sapply,因为 files.list 返回文件名的字符向量。

    【讨论】:

      【解决方案2】:

      我们可以对files 向量进行预过滤,然后正常循环。

      files0 <- c('file01042016_abc.csv', 'file020142016_abc.csv', 
                  'file03042016_abc.csv', 'file26092019_abc.csv', 
                  'file09042016_abc.csv')
      
      k <- c('01042016', '05042016', '09042016')
      pat <- paste(k, collapse="|")
      
      files <- grep(pat, files0, value=TRUE)
      files
      # [1] "file01042016_abc.csv" "file09042016_abc.csv"
      

      【讨论】:

      • 不错的答案。好像是我的^^
      • @TimBiegeleisen:是的,我们都有相同的基本想法,使用grep() 选择相关文件名,但只要函数是矢量化的,我更愿意将其保留在循环之外。跨度>