You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于文件名日期区分读取不同格式CSV的R语言需求

按文件版本差异读取CSV数据

问题背景

我有一批CSV格式的气象数据文件,路径如下:

"F:/IMGW/2010/B00300S_2010_12.csv"
"F:/IMGW/2014/B00300S_2014_12.csv"
"F:/IMGW/2015/B00300S_2015_12.csv"
"F:/IMGW/2016/B00300S_2016_12.csv"
"F:/IMGW/2017/B00300S_2017_12.csv"
"F:/IMGW/2018/B00300S_2018_12.csv"
"F:/IMGW/2019/B00300S_2019_12.csv"
"F:/IMGW/2020/B00300S_2020_12.csv"
"F:/IMGW/2021/B00300S_2021_12.csv"
"F:/IMGW/2022/B00300S_2022_12.csv"
"F:/IMGW/2023/B00300S_2023_12.csv"
"F:/IMGW/2024/B00300S_2024_06.csv"

原本使用以下代码构建文件列表并批量读取数据:

构建文件列表

rok <- c(2010,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024)
B.list.1 <- lapply (rok, function (rok) {
  dir_ls(paste0(sciezka, "/", rok), regexp = paste0("B00300S_", rok, ".*csv$"))
})

B00300S_flist <- do.call (rbind, B.list)

批量读取文件

All <- lapply(B00300S_flist,function(i){
  read.csv(i,  header=FALSE, sep=";", dec = ",", na.strings = "***", skipNul = TRUE) 
})

B00300S_multi <- do.call (plyr::rbind.fill, All)

但从2024_06的文件开始,文件格式发生变化:新增表头行,小数分隔符从逗号改为点。需要根据文件名判断格式,选择对应的读取参数。

解决方案

修改批量读取的代码,在lapply的匿名函数中加入条件判断,根据文件名匹配结果选择读取参数:

All <- lapply(B00300S_flist, function(i) {
  # 判断是否为2024年6月及以后的文件
  if (grepl("2024_06|2024_0[7-9]|2024_[1-2][0-9]", i)) {
    # 新格式:带表头、小数分隔符为点
    read.csv(i, header=TRUE, sep=";", dec = ".", na.strings = "***", skipNul = TRUE)
  } else {
    # 旧格式:无表头、小数分隔符为逗号
    read.csv(i, header=FALSE, sep=";", dec = ",", na.strings = "***", skipNul = TRUE)
  }
})

B00300S_multi <- do.call(plyr::rbind.fill, All)

说明

  • 正则表达式2024_06|2024_0[7-9]|2024_[1-2][0-9]可以匹配2024年6月到12月的所有文件,后续新增2024年下半年的文件无需修改代码。
  • 如果仅需针对2024_06单独处理,可简化判断条件为grepl("2024_06", i)。

内容的提问来源于stack exchange,提问作者GrBa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 07:33:20