You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:20:13