R循环绑定JSON数据报Can't recycle错误如何定位问题文件
循环绑定JSON数据报错定位方案
报错场景
执行批量读取JSON文件并按行合并的循环代码时,触发vctrs包长度回收错误:
Error in vctrs::data_frame(): ! Can't recycle users (size 117) to match places (size 3). Run
rlang::last_error()to see where the error occurred.
原有执行代码如下:
filesU <- list.files("C:/Users/artde/OneDrive/Documents/Master R/Master R/Project 1/Json/Daran_API_U/") tweetsU = fromJSON("C:/Users/artde/OneDrive/Documents/Master R/Master R/Project 1/Json/Daran_API_U/users_1344795476151971842.json", flatten=T) filesU <- filesU[-1] for (file in 1:length(filesU)) { tweetsU_loop = fromJSON(paste0("C:/Users/artde/OneDrive/Documents/Master R/Master R/Project 1/Json/Daran_API_U/", filesU[file])) tweetsU = bind_rows(tweetsU,tweetsU_loop) }
已知同逻辑处理其他数据集可正常运行,判断为部分JSON文件解析后的数据结构、字段长度和其余文件不匹配。因待处理文件共640个,无明显文件名、文件大小异常,需要可快速定位问题文件的方法。
定位方法
方法1:循环内加错误捕获,直接输出触发报错的文件
用tryCatch包裹行绑定步骤,一旦触发报错就直接打印当前处理的文件名、报错信息,同时可选择跳过问题文件继续遍历剩余文件,无需手动逐个测试。
改造后的可定位代码如下:
library(jsonlite) library(dplyr) # 定义文件目录,开启full.names参数直接获取完整路径,避免手动拼接路径出错 file_dir <- "C:/Users/artde/OneDrive/Documents/Master R/Master R/Project 1/Json/Daran_API_U/" filesU <- list.files(file_dir, full.names = TRUE, pattern = "\\.json$") # 初始化存储对象 problem_files <- c() tweetsU <- fromJSON(filesU[1], flatten = TRUE) # 从第二个文件开始遍历 for (i in 2:length(filesU)) { current_path <- filesU[i] # 打印当前处理进度 cat("Processing:", i, "/", length(filesU), basename(current_path), "\n") current_data <- fromJSON(current_path, flatten = TRUE) # 捕获绑定环节的错误 tryCatch({ tweetsU <- bind_rows(tweetsU, current_data) }, error = function(e) { # 输出问题文件名和对应报错信息 cat("❌ Error in file:", basename(current_path), "\nMsg:", e$message, "\n") # 将问题文件存入向量,遍历结束后可直接查看 problem_files <<- c(problem_files, current_path) }) } # 遍历完成后输出所有问题文件清单 cat("All problem files:\n") print(problem_files)
方法2:预校验所有文件结构,提前标记不一致文件
报错本质是不同JSON文件解析后,列名、嵌套字段长度、子表结构不匹配,可在绑定前先做结构校验,不用等到绑定环节触发报错才定位。以第一个正常读取的文件为结构基准,逐个比对剩余文件的列数、列名、嵌套列长度,直接标记结构不符合的文件:
# 以第一个文件为结构基准 base_col <- colnames(tweetsU) base_ncol <- ncol(tweetsU) for (i in 2:length(filesU)) { current_path <- filesU[i] current_data <- fromJSON(current_path, flatten = TRUE) # 校验列数、列名一致性 if (ncol(current_data) != base_ncol | !all(colnames(current_data) %in% base_col)) { cat("Structure mismatch (columns):", basename(current_path), "\n") problem_files <<- c(problem_files, current_path) next } # 校验列表型嵌套列(如users、places)的长度是否与主表行数匹配 list_cols <- names(which(sapply(current_data, is.list))) for (col in list_cols) { if (length(current_data[[col]]) != nrow(current_data)) { cat("Length mismatch in column", col, "of file:", basename(current_path), "\n") problem_files <<- c(problem_files, current_path) break } } }
后续处理
定位到问题文件后,单独读取对应文件查看结构差异,对缺失字段补空值、对嵌套结构做统一扁平化处理后,再重新执行合并即可。
内容的提问来源于stack exchange,提问作者Daworn
相关产品推荐
相关产品推荐

