如何在R中按指定日期范围加载含日期命名的文件?
在R中按日期范围批量加载带日期文件名的文件
问题场景
需要批量加载文件名包含8位日期(格式YYYYMMDD)的txt文件,文件名示例为SD07_TWK_20190822_003004.txt,要求仅加载指定日期范围内的文件(起始日期20190822,结束日期20190823)。现有批量加载代码未实现日期筛选,尝试自行添加筛选逻辑时出现错误。
原代码问题分析
你之前的尝试中,错误地从完整文件路径(filepath)中截取日期,而应该从文件名本身截取——完整路径包含前缀目录,导致截取位置偏移,无法正确获取日期。此外,先遍历所有文件再判断的效率较低,建议先筛选目标文件名再加载。
解决方案
方案1:先筛选文件名再加载(推荐)
先提取所有txt文件的日期,筛选出符合范围的文件名后再循环加载,逻辑更清晰且效率更高:
# 配置参数 path = "C:/path" date_start = "20190822" date_end = "20190823" colnamesfull = c("time","v","a","t1","t2","t3","t4","t5","t6","t7","t8") # 获取所有txt格式文件名(仅文件名,不含路径) filenames = list.files(path = path, pattern = "\\.txt$", full.names = FALSE) # 提取每个文件名中的8位日期(位置10-17,匹配你的文件名格式) file_dates = substr(filenames, 10, 17) # 筛选符合日期范围的文件名 filtered_filenames = filenames[file_dates >= date_start & file_dates <= date_end] # 循环加载筛选后的文件 for(i in filtered_filenames){ filepath = file.path(path, i) # 生成不带.txt后缀的变量名 var_name = gsub("\\.txt$", "", i) assign(var_name, read.table(filepath, skip = 20, col.names = colnamesfull, sep = ",")) }
方案2:修正原循环的判断逻辑
如果要保留原循环结构,只需修正日期截取的对象为文件名而非完整路径:
# 配置参数 path = "C:/path" date_start = "20190822" date_end = "20190823" colnamesfull = c("time","v","a","t1","t2","t3","t4","t5","t6","t7","t8") # 获取所有txt文件名 filenames = list.files(path = path, pattern = "\\.txt$") # 循环遍历并筛选加载 for(i in filenames){ # 从文件名中提取日期 file_date = substr(i, 10, 17) if(file_date >= date_start & file_date <= date_end){ filepath = file.path(path, i) var_name = gsub("\\.txt$", "", i) assign(var_name, read.table(filepath, skip = 20, col.names = colnamesfull, sep = ",")) } }
关键说明
- 使用
\\.txt$作为匹配模式,确保仅匹配以.txt结尾的文件,避免误匹配类似test.txt.bak的非目标文件。 substr(filenames, 10, 17)的截取位置是基于你的文件名格式SD07_TWK_YYYYMMDD_XXXXXX.txt确定的——前9个字符为SD07_TWK_,因此第10到17位正好是8位日期。- 用
gsub("\\.txt$", "", i)生成不带后缀的变量名,避免出现SD07_TWK_20190822_003004.txt这种带后缀的变量名,更符合R的变量命名习惯。
内容的提问来源于stack exchange,提问作者Djingleberg
相关产品推荐
相关产品推荐

