R语言循环处理csv文件时write_parquet重复覆盖文件如何解决
R语言循环处理CSV输出Parquet文件覆盖问题解决方案
核心问题原因
现有代码输出路径写为固定字符串'E:/P/i.parquet',循环变量i被识别为普通字符而非变量,所有循环都写入同一个文件导致覆盖。
修改后可运行代码
rm(list = ls()) gc() # 加载依赖包 require("data.table") require("arrow") # 定义路径参数,避免硬编码重复修改 input_dir <- "E:/TransferComplete/07/" output_dir <- "E:/P/" # 读取所有csv文件,正则匹配避免误判其他格式文件 files <- list.files(path = input_dir, pattern = "\\.csv$", full.names = FALSE) for (i in files){ loopStart <- Sys.time() # 读取CSV指定列 bb <- fread(file.path(input_dir, i), header = TRUE, sep = ",", data.table = FALSE, stringsAsFactors = FALSE, select = c("x","y","z")) # 生成输出文件名:替换原CSV后缀为Parquet,保留原文件名 output_filename <- gsub("\\.csv$", ".parquet", i) output_full_path <- file.path(output_dir, output_filename) # 写入Parquet文件 write_parquet(bb, output_full_path) loopEnd <- Sys.time() loopTime <- round(as.numeric(loopEnd) - as.numeric(loopStart), 0) # 可选:打印进度,方便排查问题 message("已完成文件:", i, ",耗时:", loopTime, "秒") # 清理本次循环内存占用 rm(bb) gc() }
优化说明
- 统一管理输入输出路径,避免循环内重复调用
setwd导致工作目录混乱 - 使用
file.path()拼接路径,自动适配不同操作系统的路径分隔符规则 list.files()添加正则匹配规则,仅匹配后缀为.csv的文件,避免误读取其他格式文件- 循环结束后清理本次读取的数据集再执行内存回收,效率更高
- 新增进度打印逻辑,出现异常时可快速定位到出错的文件
内容的提问来源于stack exchange,提问作者JBS
相关产品推荐
相关产品推荐

