R语言:循环中每X次迭代临时写入CSV文件的实现咨询
实现每X次迭代写入CSV的方案
我来帮你搞定这个需求,核心就是在循环里加个判断逻辑,每次迭代到X的倍数(或者最后一次迭代)时,把累积的数据写入文件就行。下面是修改后的完整代码,我还顺便优化了你的URL拼接逻辑,避免一堆重复的if-else:
library(RJSONIO) baseurl <- "http://zoeken.kvk.nl/Address.ashx?site=handelsregister&partialfields=&q=010" pages3 <- list() X <- 100 # 这里设置每100次迭代写入一次,你可以改成自己需要的数字 total_iterations <- 99999 for(i in 1:total_iterations){ # 用sprintf简化URL后缀拼接,自动补前导零到5位 url_suffix <- sprintf("%05d", i) mydata <- fromJSON(paste0(baseurl, url_suffix), flatten=TRUE) # 将当前数据加入累积列表 pages3[[length(pages3) + 1]] <- mydata # 判断是否触发写入:要么是X的倍数,要么是最后一次迭代 if(i %% X == 0 || i == total_iterations){ # 把列表转换成数据框(如果结构有差异,推荐用dplyr::bind_rows替代do.call(rbind)) data_df <- do.call(rbind, pages3) # 生成带迭代范围的文件名,方便后续管理 start_num <- ifelse(i %% X == 0, i - X + 1, (i %/% X)*X + 1) filename <- paste0("kvk_data_", start_num, "_to_", i, ".csv") # 写入CSV,设置row.names=FALSE避免多余的行号,UTF-8编码保证特殊字符正常 write.csv(data_df, filename, row.names = FALSE, fileEncoding = "UTF-8") # 清空列表释放内存(如果需要保留所有数据到最后,可以注释掉这行) pages3 <- list() # 打印提示信息,方便跟踪进度 cat("已完成", i, "次迭代,文件", filename, "已成功写入\n") } }
关键细节说明:
- URL拼接优化:用
sprintf("%05d", i)可以自动把i格式化为5位的字符串,比如i=5会变成00005,i=123会变成00123,直接替代了你原来一堆if-else判断,代码更简洁不易错。 - 写入触发条件:
i %% X == 0判断当前迭代次数是否是X的倍数,i == total_iterations确保最后一批不足X次的数据也能被写入,不会丢失。 - 数据框转换:
do.call(rbind, pages3)适用于每个mydata结构完全一致的情况;如果不同迭代返回的JSON结构有差异,建议用dplyr::bind_rows(pages3),它会自动补全缺失的列并填充NA。 - 内存管理:每次写入后清空
pages3列表,避免累积大量数据占用过多内存,这对99999次这种大循环特别重要。 - 文件名命名:用
start_num_to_i的格式命名文件,比如kvk_data_1_to_100.csv,方便你后续查找、合并这些文件。
内容的提问来源于stack exchange,提问作者RobertHaa
相关产品推荐
相关产品推荐

