如何在R中将.txt转.csv并拆分入侵植物信息列
解决R语言中txt转csv并拆分列的问题
修改后的完整代码
# 获取所有目标txt文件 filelist <- list.files(pattern = "\\.txt$") # 循环处理每个文件 for (i in seq_along(filelist)) { input <- filelist[i] output <- paste0(gsub("\\.txt$", "", input), ".csv") cat("Processing the file:", input, "\n") # 读取文件所有行,跳过第一行的标题行 lines <- readLines(input)[-1] # 逐行清理并拆分数据 processed_lines <- lapply(lines, function(line) { # 移除开头的'(a)'类编号及后续空格,同时清理首尾空白 line_clean <- gsub("^\\([a-z]\\)\\s*", "", trimws(line)) # 按长破折号'–'拆分,忽略破折号前后的空格 split_parts <- strsplit(line_clean, "\\s*–\\s*")[[1]] # 拆分学名的属和种 scientific_name <- trimws(split_parts[1]) genus_species <- strsplit(scientific_name, "\\s+")[[1]] genus <- genus_species[1] species <- if(length(genus_species) > 1) paste(genus_species[-1], collapse = " ") else "" # 提取通用名 common_name <- if(length(split_parts) > 1) trimws(split_parts[2]) else "" # 返回整理后的单行数据 data.frame(属 = genus, 种 = species, 通用名 = common_name, stringsAsFactors = FALSE) }) # 合并所有行成完整数据框 final_data <- do.call(rbind, processed_lines) # 写入csv文件,指定UTF-8编码避免中文乱码 write.csv(final_data, file = output, row.names = FALSE, fileEncoding = "UTF-8") }
关键步骤说明
- 读取文件:用
readLines读取所有行,[-1]跳过第一行的“有害杂草名录”标题。 - 清理编号:通过正则表达式
^\\([a-z]\\)\\s*匹配并删除开头的'(a)'、'(b)'类标识,trimws清理字符串首尾的冗余空格。 - 拆分内容:用
strsplit按长破折号拆分,正则\\s*–\\s*会自动忽略破折号前后的任意空格。 - 拆分属种:将学名按空格拆分,第一部分作为属名,剩余部分合并为种名(兼容
spp.这类多字符种名)。 - 保存文件:用
write.csv输出结果,指定fileEncoding = "UTF-8"确保中文正常显示。
示例输出效果
处理你提供的测试数据后,生成的csv会包含三列结构化内容:
| 属 | 种 | 通用名 |
|---|---|---|
| Abrus | precatorius | rosary pea |
| Aeginetia | spp. | aeginetia |
| Ageratina | adenophora | crofton weed |
| Alectra | spp. | alectra |
内容的提问来源于stack exchange,提问作者Daniel Calzadilla
相关产品推荐
相关产品推荐

