在R中修复导入CSV时被错误拆分的续行问题
嘿,这个问题我刚好碰到过类似的场景,给你两个在R里高效处理的方案,不管你习惯用base R还是tidyverse都能搞定:
首先先模拟你的输入数据(注意\r在R字符串里要转义成\\r):
lines <- c( "CLSL;2017-01-09;PA930082402;23;10986450", "CLNA;2016-09-05 /\\r/", ";650963783;1;60010670" )
方案一:Base R 向量操作(适合大文件,效率高)
这种方法不用循环,直接通过向量索引和正则处理,对大型数据集更友好:
# 定位所有以"/\\r/"结尾的损坏行 bad_rows <- grepl("/\\\\r/$", lines) # 将损坏行的内容去掉"/\\r/",并与下一行合并 lines[bad_rows] <- gsub("/\\\\r/", "", lines[bad_rows]) |> paste0(lines[bad_rows + 1]) # 过滤掉那些被合并的"新行"(也就是损坏行的下一行) fixed_lines <- lines[!c(bad_rows[-length(bad_rows)], FALSE)]
运行后fixed_lines就是你想要的结果:
> fixed_lines [1] "CLSL;2017-01-09;PA930082402;23;10986450" "CLNA;2016-09-05;650963783;1;60010670"
方案二:Tidyverse 管道风格(代码更易读)
如果你习惯用dplyr和stringr,可以用这种更直观的管道写法:
library(dplyr) library(stringr) fixed_lines <- tibble(line = lines) |> # 标记哪些行是需要合并的损坏行 mutate(is_bad = str_detect(line, "/\\\\r/$")) |> # 把损坏行的结尾标记去掉,再拼接下一行的内容;同时标记要删除的行 mutate( line = if_else(is_bad, str_remove(line, "/\\\\r/$") |> str_c(lead(line)), line), to_remove = lead(is_bad, default = FALSE) ) |> # 过滤掉那些被合并的冗余行 filter(!to_remove) |> # 提取处理后的行向量 pull(line)
这个方法的逻辑和base R版本一致,只是用了tidyverse的语法,可读性更强,适合团队协作或者需要更清晰代码的场景。
内容的提问来源于stack exchange,提问作者Blazej Kowalski
相关产品推荐
相关产品推荐

