在R中如何同时按扩展名与日期筛选并复制多文件?
解决.wdf文件筛选、新增文件检测与合并问题
我明白你现在的核心痛点是没法同时筛选出文件名含指定日期(201907)且后缀为.wdf的文件,另外还想实现只处理新增文件的逻辑,我来一步步帮你搞定这些问题:
1. 修复正则表达式:同时匹配日期和文件扩展名
你之前用|(逻辑或)的写法,只会匹配满足其中一个条件的文件,这就是为什么要么拿到所有.wdf,要么拿到含日期的无关文件。要实现逻辑与(同时满足两个条件),你需要把两个规则整合到同一个正则里:
正确的正则应该是这样的:
pattern <- "^.*_201907.*\\.wdf$"
正则解释:
^.*:匹配文件名开头的任意字符_201907:精准匹配文件名中的日期片段(对应你示例里的ACCEPTED_20190710...).*:匹配日期和扩展名之间的任意字符\\.wdf$:匹配以.wdf结尾的文件($确保是文件末尾,避免匹配到类似.wdf.bak这类后缀的文件)
用这个正则去筛选文件,就能精准拿到同时符合日期和扩展名要求的文件了:
target_dir <- "//xyz/ExternalUsers/em/em18thjudic/uploaded_files/" filtered_files <- list.files(path = target_dir, pattern = pattern, full.names = TRUE)
2. 按文件修改时间筛选(比文件名日期更靠谱)
如果你不想依赖文件名里的日期(毕竟有时候文件名日期可能和实际文件生成时间不一致),可以直接用文件的修改时间来筛选7月的文件,这样更准确:
# 获取目录下所有文件的完整路径 all_files <- list.files(target_dir, full.names = TRUE) # 获取每个文件的修改时间 file_mtimes <- file.info(all_files)$mtime # 筛选2019年7月的.wdf文件 july_wdf_files <- all_files[ grepl("\\.wdf$", all_files) & format(file_mtimes, "%Y%m") == "201907" ]
这段代码先筛选.wdf后缀,再筛选修改时间在2019年7月的文件,完美实现双重条件筛选。
3. 实现仅处理新增文件的逻辑
要只拉取新增文件,我们可以维护一个已处理文件日志,每次运行脚本时对比当前文件和日志记录,只处理未记录的文件:
# 定义日志文件路径,用来记录已经处理过的文件 processed_log <- "processed_wdf_files.txt" # 读取已处理文件列表(如果日志文件不存在就初始化空列表) if (file.exists(processed_log)) { processed_files <- readLines(processed_log) } else { processed_files <- character(0) } # 从筛选好的文件中找出未处理的新增文件 new_files <- setdiff(july_wdf_files, processed_files) # 处理新增文件(复制到目标文件夹) if (length(new_files) > 0) { # 替换成你的目标文件夹路径 dest_dir <- "你的目标文件夹路径" file.copy(new_files, dest_dir, overwrite = FALSE) # 更新日志,把新增文件记录进去 writeLines(c(processed_files, new_files), processed_log) }
这样每次运行脚本,只会处理之前没处理过的新增文件,避免重复操作。
4. 后续:转换为CSV并合并成单文件
假设你有能把.wdf转成CSV的工具/函数(比如针对特定格式的自定义函数wdf_to_csv),可以这样批量转换并合并:
# 批量转换新增的.wdf文件为CSV lapply(new_files, function(file_path) { # 生成对应的CSV文件名 csv_name <- sub("\\.wdf$", ".csv", basename(file_path)) csv_path <- file.path(dest_dir, csv_name) # 调用转换函数(这里需要你根据实际情况替换成真实的转换逻辑) wdf_to_csv(input = file_path, output = csv_path) }) # 合并所有CSV为单个可筛选的文件 all_csv <- list.files(dest_dir, pattern = "\\.csv$", full.names = TRUE) combined_data <- do.call(rbind, lapply(all_csv, read.csv)) # 保存合并后的文件 write.csv(combined_data, file.path(dest_dir, "combined_wdf_data.csv"), row.names = FALSE)
合并后的CSV文件就可以直接按列筛选分析了。
内容的提问来源于stack exchange,提问作者ShipwreckSiren
相关产品推荐
相关产品推荐

