R批量读取CSV时筛选指定列值及跳过首行的实现方法
R批量筛选读取销售CSV文件解决方案
1 修正文件匹配规则
你原有代码中的pattern和实际文件名规则不匹配,先调整获取2019年所有目标文件的逻辑:
library(tidyverse) # 依赖dplyr、readr、purrr组件,也可以单独加载对应包 # 匹配所有命名符合Sales-月份-2019.csv规则的文件,忽略大小写差异 myfiles <- list.files( pattern = "^Sales-.+-2019\\.csv$", ignore.case = TRUE, full.names = TRUE )
2 批量读取+筛选实现(不加载全量数据)
有两种常用实现方式,都可以满足「跳过每个文件首行数据、仅保留文章编号为1-5的行」的需求:
方式1:分块读取(适合单文件体积极大的场景)
读取时按分块处理,全程不会加载完整文件到内存:
# 定义分块处理规则 process_chunk <- function(chunk, pos) { # 跳过每个文件的第一行数据,对应你原有单文件写法的[-1,] if (pos == 1) chunk <- chunk[-1, ] # 筛选指定文章编号,需将article_id替换为你实际的列名 chunk %>% filter(article_id %in% 1:5) } # 批量处理所有文件并合并结果 result <- map_dfr(myfiles, function(file_path) { read_csv_chunked( file = file_path, callback = DataFrameCallback$new(process_chunk), chunk_size = 10000, # 可根据内存大小调整分块行数 show_col_types = FALSE ) })
方式2:逐文件处理(通用场景)
逐个读取文件,处理完立即释放原文件内存,适合大部分场景:
result <- map_dfr(myfiles, function(file_path) { read_csv(file_path, show_col_types = FALSE) %>% slice(-1) %>% # 跳过每个文件的第一行数据 filter(article_id %in% 1:5) # 筛选指定文章编号 })
沿用ldply的适配写法
如果你想继续使用原有代码的ldply逻辑,调整后代码如下:
library(plyr) result <- ldply(myfiles, function(x) { read_csv(x, show_col_types = FALSE) %>% slice(-1) %>% filter(article_id %in% 1:5) })
注意事项
- 请将代码中的
article_id替换为你实际存储文章编号的列名 - 如果你的CSV表头在第二行,不需要保留第一行作为表头,直接在
read_csv中添加skip = 1参数即可,无需额外加slice(-1)
内容的提问来源于stack exchange,提问作者jontieez
相关产品推荐
相关产品推荐

