如何在R中无需解压直接读取Zip内所有CSV并合并为数据框?
R语言无需解压批量读取Zip压缩包内所有CSV并合并为数据框
核心思路
先获取Zip包内所有CSV文件的名称,再通过批量读取逻辑直接从压缩包内读取数据并合并成单个数据框,全程无需解压文件。
所需R包
需要加载readr(高效读取CSV)、purrr(批量处理函数)和stringr(筛选文件名):
library(readr) library(purrr) library(stringr)
本地Zip文件处理代码
如果Zip文件已保存在本地:
# 定义本地Zip文件路径 zip_file <- "myfile.zip" # 提取Zip内所有CSV文件的名称 csv_files <- unzip(zip_file, list = TRUE)$Name %>% str_subset("\\.csv$") # 批量读取并合并所有CSV combined_df <- map_df(csv_files, ~read_csv(unz(zip_file, .x)))
远程大型Zip文件处理代码
针对你提到的美国2020财年合同数据这类大型远程Zip文件,建议先下载到临时文件(避免占用本地永久存储空间),再进行读取:
# 远程Zip文件地址 zip_url <- "https://files.usaspending.gov/award_data_archive/FY2020_All_Contracts_Full_20221008.zip" # 创建临时文件存储下载的Zip temp_zip <- tempfile(fileext = ".zip") download.file(zip_url, temp_zip, mode = "wb") # 提取临时Zip内的所有CSV文件名 csv_files <- unzip(temp_zip, list = TRUE)$Name %>% str_subset("\\.csv$") # 批量读取并合并数据 combined_df <- map_df(csv_files, ~read_csv(unz(temp_zip, .x))) # 可选:读取完成后删除临时Zip文件 file.remove(temp_zip)
优化提示
- 对于超大型CSV,建议在
read_csv中指定col_types参数(比如col_types = cols()),手动定义列数据类型,既能加快读取速度,也能避免自动类型推断时的内存浪费。 - 如果Zip内的CSV文件列结构不一致,
map_df会自动对齐缺失列,缺失值将填充为NA。
内容的提问来源于stack exchange,提问作者Mel G
相关产品推荐
相关产品推荐

