使用read.csv读取文件时如何忽略含特定名称的CSV文件
解决方案
你可以通过两种方式实现过滤带rerun关键词的文件,同时修正了原代码里的几处逻辑小问题:
方式1:直接在获取文件列表时过滤(推荐)
利用dir()函数支持的Perl正则规则,直接匹配所有不含rerun的csv文件,不需要额外加判断逻辑:
# 初始化列表存储每个文件的结果,比循环内逐次rbind效率高得多 result_list <- list() file_path <- "/Users/jackdavis/Desktop/Results/" # 正则规则:匹配文件名不含rerun、后缀为csv的所有文件 all_files <- dir(file_path, pattern = "^(?!.*rerun).*\\.csv$", recursive = TRUE, perl = TRUE) for (i in seq_along(all_files)) { f <- all_files[i] print(f) tmp <- read.csv(paste0(file_path, f)) result_list[[i]] <- data.frame( ID = f, Date = tmp$TEST_DATE, Time = tmp$TEST_TIME, Machine = tmp$DEVICE, Op = tmp$OPERATOR, PTC = tmp$SAMPLECODE # 原代码此处pcq为笔误,修正为读取的临时变量tmp ) } # 最后统一合并所有文件的结果 test <- do.call(rbind, result_list)
方式2:在循环内加判断跳过目标文件
如果你不想修改匹配规则,也可以在循环开头加判断,遇到含rerun的文件直接跳过:
result_list <- list() file_path <- "/Users/jackdavis/Desktop/Results/" all_files <- dir(file_path, pattern = "\\.csv$", recursive = TRUE) for (i in seq_along(all_files)) { f <- all_files[i] # 检测到文件名含rerun就直接进入下一轮循环 if (grepl("rerun", f, ignore.case = FALSE)) { next } print(f) tmp <- read.csv(paste0(file_path, f)) result_list[[i]] <- data.frame( ID = f, Date = tmp$TEST_DATE, Time = tmp$TEST_TIME, Machine = tmp$DEVICE, Op = tmp$OPERATOR, PTC = tmp$SAMPLECODE ) } test <- do.call(rbind, result_list)
原代码问题说明
- 原代码中每次循环用
rbind(test, ...)赋值给test1,但没有更新test变量,最终只会保留最后一个文件的结果 - 原代码里
PTC=pcq$SAMPLECODE的pcq属于笔误,应该是读取的临时变量tmp - 循环内逐次
rbind会不断复制内存,文件数量多的时候运行效率极低,用列表存储最后统一合并性能提升非常明显
内容的提问来源于stack exchange,提问作者Rnovice19
相关产品推荐
相关产品推荐

