如何读取Zip压缩包中非重复文件及最高编号的最新文件?
压缩包文件读取:去重与最新版本筛选方案
一、读取非重复的基础文件(data.csv 和 info.csv)
你的原代码报错是因为str_detect(files$Name, fileExt)返回的是布尔矩阵(长度与fileExt对应,而非文件列表),duplicated无法正确处理这种结构。解决思路是先提取每个文件的「基础名称」(去掉括号内的编号后缀),再按基础名称去重:
library(tidyverse) # 获取压缩包内文件列表 files <- unzip("data.zip", list = TRUE) # 生成基础名称并去重 files_clean <- files %>% mutate( # 移除文件名中的"(数字)"后缀,得到统一的基础名称 base_name = str_replace(Name, "\\s\\(\\d+\\)", "") ) %>% # 按基础名称去重,保留每个名称对应的第一个文件(即无编号的原始文件) distinct(base_name, .keep_all = TRUE) # 提取去重后的文件路径,直接读取压缩包内的文件 files_no_dup <- files_clean$Name files_read <- map(files_no_dup, ~read_csv(unz("data.zip", .x)))
二、读取编号最高的最新文件
如果需要筛选每个文件组中编号最大的版本(比如info (1).csv优先于info.csv),可以通过提取版本编号并分组筛选实现:
library(tidyverse) files <- unzip("data.zip", list = TRUE) # 提取基础名称与版本号,筛选每组最新文件 files_latest <- files %>% mutate( # 生成基础名称 base_name = str_replace(Name, "\\s\\(\\d+\\)", ""), # 提取括号内的版本编号,无编号的文件版本号设为0 version_number = as.integer(str_extract(Name, "(?<=\\()\\d+(?=\\))")) %>% replace_na(0) ) %>% group_by(base_name) %>% # 每组选择版本号最大的文件 slice_max(version_number, n = 1) %>% ungroup() # 读取最新版本的文件 files_latest_paths <- files_latest$Name files_read_latest <- map(files_latest_paths, ~read_csv(unz("data.zip", .x)))
关键细节说明
- 使用
unz()直接读取压缩包内文件,无需提前解压,节省磁盘空间。 - 正则表达式
\\s\\(\\d+\\)匹配文件名中的(数字)格式后缀,(?<=\\()\\d+(?=\\))用于精准提取括号内的数字。
内容的提问来源于stack exchange,提问作者ksinva
相关产品推荐
相关产品推荐

