如何用Bash或R处理超大CSV嵌套单元格,提取单行内容至独立文件
处理超大CSV文件:提取指定ID的嵌套内容或拆分文件
一、Bash工具方案(awk)
1. 提取每行ID对应的嵌套单元格内容到单独文件
针对每行仅含一对双引号的CSV格式,用awk直接处理可规避换行问题:
awk -F, '{ id = $1; # 匹配双引号内的内容 match($0, /"([^"]+)"/, arr); nested_content = arr[1]; # 写入以ID命名的文件 print nested_content > id".txt"; close(id".txt"); # 关闭文件句柄,避免触发系统文件数上限 }' large_file.csv
2. 将整行内容写入对应ID的文件
如果需要保留整行数据,执行以下命令:
awk -F, '{ id = $1; print $0 > id".csv"; close(id".csv"); }' large_file.csv
注:若存在重复ID,后续行内容会追加到同一文件;若需覆盖,将
>改为>即可。必须调用close(),否则处理大量ID时会因文件句柄耗尽报错。
二、R语言分块处理方案
针对150GB+的超大文件,需采用分块读取策略,以下提供两种实现方式:
1. 用readr分块提取嵌套内容
library(readr) library(stringr) # 定义单块数据处理函数 process_chunk <- function(chunk, pos) { # 提取ID和双引号内的嵌套内容 chunk$id <- chunk[[1]] chunk$nested_content <- str_extract(chunk[[7]], '(?<=")[^"]+(?=")') # 逐行写入对应文件 for (i in seq_len(nrow(chunk))) { writeLines(chunk$nested_content[i], paste0(chunk$id[i], ".txt"), append = TRUE) } return(NULL) } # 分块读取文件,每块10000行(可根据内存调整) read_csv_chunked("large_file.csv", callback = DataFrameCallback$new(process_chunk), chunk_size = 10000, col_types = cols(.default = col_character())) # 统一按字符类型读取,避免解析错误
2. 用data.table分块拆分整行到ID文件
library(data.table) chunk_size <- 10000 con <- file("large_file.csv", "r") header <- readLines(con, n = 1) # 读取表头 # 循环读取并处理每块数据 while (length(chunk <- fread(con, nrows = chunk_size, header = FALSE, stringsAsFactors = FALSE)) > 0) { setnames(chunk, strsplit(header, ",")[[1]]) # 为数据块添加表头 # 按ID分组写入文件 chunk[, { write.table(.SD, paste0(.BY[[1]], ".csv"), append = TRUE, sep = ",", row.names = FALSE, col.names = !file.exists(paste0(.BY[[1]], ".csv"))) }, by = ID] # 假设第一列表头为ID } close(con)
注:
col.names = !file.exists(...)确保每个ID文件仅写入一次表头;若无需表头,可删除该参数。
内容的提问来源于stack exchange,提问作者TDeramus
相关产品推荐
相关产品推荐

