如何在R中批量处理多CSV文件识别空值并生成日志
批量CSV文件列数据质量检查方案
需求说明
我有多个列数不同的.csv文件,目前已有R代码可对单个文件的各列有效值、空值数量做质量检查且运行正常。需要修改代码实现批量处理所有CSV文件,输出每个文件的统计结果,并生成日志文件。
现有代码
install.packages("readr") library(readr) check_column <- function(df, column) { valid_values <- !is.na(df[[column]]) num_valid <- sum(valid_values) num_null <- nrow(df) - num_valid return(c(num_valid, num_null)) } #Read the CSV file df <- read_csv("data.csv") for (column in names(df)) { results <- check_column(df, column) print(paste(column, ": ", results[1], " valid, ", results[2], " null")) }
示例数据
Csv1.csv
D_T Temp (°C) Press (Pa) ... 2021-03-01 00:00:00+00 28 1018 ... 2021-03-02 00:00:00+00 27 1017 ... 2021-03-03 00:00:00+00 28 1019 ... .. ..
Csv2.csv
D_T Temp (°C) Vel (m/s) Press (Pa) ... 2022-03-01 00:00:00+00 28 118 1018 ... 2022-03-02 00:00:00+00 27 117 1019 ... 2022-03-03 00:00:00+00 28 119 1018 ... .. ..
修改后的批量处理代码
# 加载所需包(仅首次安装需要运行install.packages) # install.packages("readr") library(readr) # 定义列检查函数(保留原逻辑) check_column <- function(df, column) { num_valid <- sum(!is.na(df[[column]])) num_null <- nrow(df) - num_valid return(c(num_valid, num_null)) } # 定义批量处理函数 batch_check_csv <- function(csv_dir = ".", log_file = "csv_quality_check.log") { # 获取指定目录下所有CSV文件路径 csv_files <- list.files(path = csv_dir, pattern = "\\.csv$", full.names = TRUE) if (length(csv_files) == 0) { message("未找到任何CSV文件") return(NULL) } # 初始化日志连接,同时输出到控制台和日志文件 sink(log_file, append = FALSE, split = TRUE) # 遍历每个CSV文件 for (file_path in csv_files) { cat("=== 开始处理文件:", basename(file_path), " ===\n", sep = "") cat("文件路径:", file_path, "\n") # 读取CSV文件并处理异常 tryCatch({ df <- read_csv(file_path, show_col_types = FALSE) cat("文件总行数:", nrow(df), "\n\n") # 遍历所有列进行检查 for (column in names(df)) { results <- check_column(df, column) result_line <- paste(column, ": ", results[1], " 有效值, ", results[2], " 空值", sep = "") cat(result_line, "\n") } }, error = function(e) { error_msg <- paste("处理文件", basename(file_path), "时出错:", e$message) cat(error_msg, "\n") }) cat("\n========================================\n\n") } # 关闭日志连接 sink() message("批量处理完成,日志已保存至:", log_file) } # 执行批量处理(默认处理当前目录下所有CSV,日志保存为csv_quality_check.log) batch_check_csv() # 如需指定目录,可调用:batch_check_csv(csv_dir = "你的CSV文件夹路径")
代码说明
- 批量文件识别:通过
list.files筛选指定目录下所有.csv后缀的文件,无需手动逐个指定 - 双渠道输出:使用
sink函数同时将结果输出到控制台和日志文件,兼顾实时查看与事后回溯需求 - 异常防护:
tryCatch捕获文件读取或处理中的错误,避免单个文件失败导致整个批量任务中断 - 兼容性:保留原有列检查逻辑,自动适配不同列数、不同列名的CSV文件
内容的提问来源于stack exchange,提问作者Michael_Brun
相关产品推荐
相关产品推荐

