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

如何读取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:00:08