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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:51:13