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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:54:00