如何用正则表达式在长CSV文本特定位置插入换行符?
修复无换行CSV文件的记录分割问题
问题背景
有一个包含数十万条记录的CSV文本文件,所有记录未添加换行符而连在一起。每条新记录的起始有固定模式:hh:mm:ss.sss,Buzzard,需要将文本分割为每条独立的记录,保存为规范的CSV文件。原尝试的R正则匹配代码未能成功实现需求。
解决方案
核心思路是利用正向预查定位每条新记录的起始位置(除第一条外),在该位置插入换行符\n。以下是完整的R实现代码:
library(stringr) library(data.table) # 原始无换行数据 Data_raw <- c("07:04:08.401,Buzzard Brook,123456.78,1234567.89,196.25,-0.41,-0.60,0.07,LARS,326800.31,6749792.66,BIG Box,0.00,0.00,0.0007:04:08.401,Buzzard Brook,123456.78,1234567.89,196.25,-0.41,-0.60,0.07,LARS,123456.78,1234567.89,BIG Box,0.00,0.00,-401.3107:02:55.357,Buzzard Brook,123456.78,1234567.89,50.41,-0.42,-0.01,0.01,LARS,123456.78,1234567.89,BIG Box,Obj 2 N.A.,Obj 2 N.A.,Obj 2 N.A.07:03:10.364,Buzzard Brook,123456.78,1234567.89,50.27,-0.20,-0.03,0.00,LARS,123456.78,1234567.89,BIG Box,Obj 2 N.A.,Obj 2 N.A.,Obj 2 N.A.") # 正则分割:在每条新记录起始前插入换行 Data_raw_2 <- str_replace_all(Data_raw, "(?<=\\S)(?=\\d{2}:\\d{2}:\\d{2}\\.\\d{3},Buzzard)", "\n") # 验证分割结果 cat(Data_raw_2) # 保存为规范的文本/CSV文件 wd <- getwd() write_lines(Data_raw_2, paste0(wd, "/cleaned_records.csv"))
正则说明
(?<=\\S):正向后顾断言,确保匹配位置的前一个字符不是空白(避免在文本开头插入多余换行)(?=\\d{2}:\\d{2}:\\d{2}\\.\\d{3},Buzzard):正向预查断言,匹配后面紧跟hh:mm:ss.sss,Buzzard模式的位置- 将上述匹配到的位置替换为
\n,即可实现每条记录独立分隔
效果验证
处理后的数据会变成每条记录单独一行的规范格式,与需求中的目标格式完全一致,可直接作为CSV文件使用。
内容的提问来源于stack exchange,提问作者Skeith
相关产品推荐
相关产品推荐

