如何用R提取Zip/Rar文件中的二级目录名称?
从Zip和Rar文件中提取二级目录名称
处理Zip文件
先通过unzip()获取压缩包内的文件列表,再通过字符串处理筛选出目标二级目录:
- 获取压缩包文件列表:
zip_list <- unzip(zipfile = "teste1.zip", list = TRUE)
- 筛选出所有目录(名称以
/结尾):
dirs <- zip_list[grepl("/$", zip_list$Name), ]
- 提取二级目录名称:
使用基础R的字符串分割方法:
# 分割路径为组件 path_parts <- strsplit(dirs$Name, "/") # 筛选二级目录(路径分割后长度为3,例如"teste1/Nova pasta1/"分割为3个元素) secondary_dir_idx <- sapply(path_parts, function(x) length(x) == 3) # 提取目录名称 subdir_names <- sapply(path_parts[secondary_dir_idx], function(x) x[2])
或者用stringr包简化操作:
library(stringr) subdir_names <- str_extract(dirs$Name, "^[^/]+/([^/]+)/$") %>% str_remove("^[^/]+/") %>% str_remove("/$") %>% na.omit()
执行后subdir_names会包含目标二级目录名称(如Nova pasta1)。
处理Rar文件
对于Rar文件,可使用unrar包或系统命令(需提前安装unrar工具):
方法1:使用unrar包
library(unrar) # 获取Rar文件列表 rar_list <- unrar_list("teste1.rar") # 筛选目录 dirs_rar <- rar_list[grepl("/$", rar_list$Name), ] # 重复Zip文件的提取逻辑 path_parts_rar <- strsplit(dirs_rar$Name, "/") secondary_dir_idx_rar <- sapply(path_parts_rar, function(x) length(x) == 3) subdir_names_rar <- sapply(path_parts_rar[secondary_dir_idx_rar], function(x) x[2])
方法2:使用系统命令(需安装unrar)
# 获取Rar内的目录列表 rar_dirs <- system("unrar lb teste1.rar | grep '/$'", intern = TRUE) # 提取二级目录名称 subdir_names_rar <- sapply(strsplit(rar_dirs, "/"), function(x) x[2])
批量处理目录下所有Zip/Rar文件
如果需要处理目录中所有压缩文件,可通过循环实现:
library(unrar) library(stringr) # 获取所有Zip和Rar文件 files <- list.files(pattern = "\\.(zip|rar)$", ignore.case = TRUE) # 存储结果的列表 all_subdirs <- list() for(file in files) { if(str_detect(file, "\\.zip$", negate = FALSE)) { # 处理Zip文件 zip_list <- unzip(file, list = TRUE) dirs <- zip_list[grepl("/$", zip_list$Name), ] subdirs <- str_extract(dirs$Name, "^[^/]+/([^/]+)/$") %>% str_remove("^[^/]+/") %>% str_remove("/$") %>% na.omit() } else { # 处理Rar文件 rar_list <- unrar_list(file) dirs <- rar_list[grepl("/$", rar_list$Name), ] subdirs <- str_extract(dirs$Name, "^[^/]+/([^/]+)/$") %>% str_remove("^[^/]+/") %>% str_remove("/$") %>% na.omit() } all_subdirs[[file]] <- subdirs } # 转换为数据框 result_df <- data.frame( 压缩文件 = rep(names(all_subdirs), sapply(all_subdirs, length)), 二级目录 = unlist(all_subdirs), stringsAsFactors = FALSE )
内容的提问来源于stack exchange,提问作者Wilson Souza
相关产品推荐
相关产品推荐

