如何识别批量CSV文件列名差异并统一所有文件的列名
R实现CSV文件列名校验与批量修正方案
1. 找出列名存在差异的文件
你之前的代码存在笔误,tri_paths应为dt_paths,我们可以基于列名的统计结果直接筛选异常文件:
# 加载依赖包 library(fs) library(purrr) library(readr) library(stringr) # 读取所有csv的首行列名字符串 dt_paths <- dir_ls(path = "data", glob = "*.csv") colname_lines <- map_chr(dt_paths, ~read_lines(.x, n_max = 1)) # 统计列名出现频次,取出现次数最多的为标准列名字符串 colname_stat <- table(colname_lines) standard_col_line <- names(colname_stat)[which.max(colname_stat)] # 筛选出列名不一致的异常文件路径 abnormal_files <- names(colname_lines[colname_lines != standard_col_line]) # 输出异常文件列表 abnormal_files
运行上述代码后,abnormal_files就是你要找的4个列名异常的文件路径。
2. 批量修正异常文件的列名
前置提示:建议先备份所有异常文件,避免误操作丢失数据
# 先把标准列名字符串转为列名向量 standard_cols <- unlist(str_split(standard_col_line, ",")) # 批量读取异常文件,替换列名后写回原路径 walk(abnormal_files, function(path) { # 读取文件 dt <- read_csv(path, show_col_types = FALSE) # 校验列数一致性,若列数不一致会抛出错误终止运行,避免数据错乱 stopifnot(length(colnames(dt)) == length(standard_cols)) colnames(dt) <- standard_cols # 写回原文件,覆盖原内容 write_csv(dt, path) })
校验修正结果
修正完成后可以重新运行列名校验代码,确认所有文件列名完全一致:
new_colname_lines <- map_chr(dt_paths, ~read_lines(.x, n_max = 1)) table(new_colname_lines) # 输出结果只有1个分类且计数为100即为修正成功
内容的提问来源于stack exchange,提问作者Ahad Zaman
相关产品推荐
相关产品推荐

