R语言如何将csv文件拆分加载为多个data frame或data table

这类单文件内嵌多块异结构表格的csv,不能直接用read.csv/fread一次性读取,核心思路是先识别每个独立表格块的行范围,再分别解析加载,以下是两种可直接复用的实现方案:
实现方案
基础R实现(无需安装额外包)
- 先按原始文本逐行读入文件,不做表格解析
- 过滤空行后,按行的连续位置切分出不同的表格块
- 对每个块单独解析为data frame
# 替换为你的csv文件实际路径 file_path <- "你的目标文件.csv" # 逐行读取原始文本 raw_content <- readLines(file_path, encoding = "UTF-8") # 过滤全空行,记录非空行的位置 valid_line_idx <- which(nzchar(trimws(raw_content))) # 按行号的连续性切分不同表格块 block_marker <- cumsum(c(1, diff(valid_line_idx) != 1)) split_blocks <- split(raw_content[valid_line_idx], block_marker) # 逐个解析块为data frame df_list <- lapply(split_blocks, function(block_text) { read.csv(text = block_text, header = TRUE, stringsAsFactors = FALSE) }) # 按顺序取出需要的data frame即可 df1 <- df_list[[1]] df2 <- df_list[[2]] # 存在第三个块时取 df_list[[3]]
data.table实现(适合大文件场景)
文件体积较大时优先用这个方案,fread读取速度远快于基础R的读表函数,不需要把全量内容加载进内存做解析:
library(data.table) file_path <- "你的目标文件.csv" # 先读入行内容定位块范围 raw_content <- readLines(file_path, encoding = "UTF-8", warn = FALSE) valid_line_idx <- which(nzchar(trimws(raw_content))) block_marker <- cumsum(c(1, diff(valid_line_idx) != 1)) block_range <- tapply(valid_line_idx, block_marker, range) # 按行范围分别读取为data.table dt_list <- lapply(block_range, function(rg) { fread( file = file_path, skip = rg[1] - 1, nrows = rg[2] - rg[1] + 1, encoding = "UTF-8" ) }) dt1 <- dt_list[[1]] dt2 <- dt_list[[2]]
注意:如果你的文件里表格块的分隔标识不是空行,而是带固定文本的标记行,只需要把切分块的逻辑替换为用
grep("标记行固定文本", raw_content)匹配到每个块的起始行号,再按起始行计算每个块的行范围即可。
内容的提问来源于stack exchange,提问作者Bouraoui Hamadou
相关产品推荐
相关产品推荐

