基于关键词匹配为批量TXT气象文件添加站点名列的实现方法咨询
实现方案
核心逻辑
你已经有完整的站点名列表,无需通过复杂正则从头文件结构中截取内容,直接采用「先读头行匹配站点→再读正式数据追加列」的两步处理逻辑,既保留data.table::fread的高性能,又能100%匹配到正确的站点名,不受站点名带空格、名称长度不统一的影响。
前置准备
将你已有的站点名整理为字符向量,示例:
# 替换为你实际的站点名列表 station_list <- c("ARMAGH", "Cex et England", "LONDON HEATHROW", ...)
完整实现代码
# 加载依赖包 library(data.table) library(stringr) library(purrr) # 1. 匹配所有目标TXT文件路径 txt_paths <- list.files(pattern = "\\.txt$", full.names = TRUE) # 2. 定义单个文件的处理函数 process_station_file <- function(file_path) { # 读取文件前3行的头部说明(头部位置靠后的话可以调大n参数) head_content <- readLines(file_path, n = 3, warn = FALSE) # 从头部内容中精准匹配已有的站点名 matched_station <- str_extract( head_content, # 将站点列表转为正则备选项,支持大小写不敏感匹配 regex(str_c(station_list, collapse = "|"), ignore_case = TRUE) ) |> na.omit() |> as.character() # 读取正式数据,沿用fread自动跳过头的特性 dt <- fread(file_path) # 新增站点名列 dt[, Station := matched_station] return(dt) } # 3. 批量处理所有文件,合并为总数据表 full_data <- map_dfr(txt_paths, process_station_file) # 可选:导出带站点列的单文件到原目录 # iwalk( # full_data, # ~fwrite(.x, file.path(dirname(txt_paths[.y]), str_c("with_station_", basename(txt_paths[.y])))) # )
适配调整说明
- 若头部说明行数较多,将
readLines的n参数调整为5或更大值即可 - 若站点名匹配需要严格区分大小写,删除
regex()中的ignore_case = TRUE参数即可
内容的提问来源于stack exchange,提问作者Stackbeans
相关产品推荐
相关产品推荐

