如何在R语言中批量截断并修改CSV文件名?
批量修改CSV文件名的R语言解决方案
需求说明
需要将格式为前缀_中间部分_日期_时间_时段_Original.csv的文件名,批量修改为前缀_中间部分.csv,保留第一个下划线,删除第二个下划线及之后的冗余内容。
可行方法
方法1:分组捕获替换
使用sub()结合正则分组,精准提取需要保留的部分:
# 原始文件名向量 names <- c("CHE1Q_S1001M1_20220615_025815_AM_Original.csv", "CHE2Q_S1002M1_20220615_030435_AM_Original.csv", "CHE6Q_S1053M2_20220615_033828_PM_Original.csv") # 批量清理文件名 clean_names <- sub("^([^_]+_[^_]+)_.*\\.csv", "\\1.csv", names) # 查看结果 clean_names
执行后输出:
[1] "CHE1Q_S1001M1.csv" "CHE2Q_S1002M1.csv" "CHE6Q_S1053M2.csv"
正则逻辑:
^([^_]+_[^_]+):从字符串开头捕获第一组内容,包含「第一个下划线前的字符+第一个下划线+第二个下划线前的字符」;_.*\\.csv:匹配第二个下划线到.csv前的所有冗余内容;\\1.csv:将匹配内容替换为捕获的第一组内容,加上.csv后缀。
方法2:正向预查替换
利用正则正向预查特性,无需分组也能实现:
clean_names <- sub("(?<=_[^_]+)_.*", "", names, perl = TRUE)
执行后结果与方法1完全一致。
正则逻辑:
(?<=_[^_]+):正向预查,确保匹配位置前是「第一个下划线+中间部分字符」;_.*:匹配从第二个下划线开始到结尾的所有内容,替换为空。
常见错误分析
sub('_.*', '', names):_.*会匹配第一个下划线及之后的所有内容,仅保留前缀部分;sub('_.*\\_', '', names):匹配第一个下划线到最后一个下划线之间的内容,结果混乱;- 两步替换
sub('_', '', names)+sub('_.*', '', names):错误删除了第一个下划线,丢失了需要保留的分隔符。
内容的提问来源于stack exchange,提问作者Jujube
相关产品推荐
相关产品推荐

