如何快捷修复CSV文件中的行拆分问题(含近百万条记录)
如何快捷修复CSV文件中的行拆分问题(含近百万条记录)
老兄,手动改近百万行这哪是人干的活!给你几个高效的办法,分分钟搞定这种CSV行拆分的问题:
方法1:用专业文本编辑器的正则替换(适合非编程用户)
比如VS Code、Notepad++这类编辑器都支持正则批量替换,步骤超简单:
- 打开你的CSV文件,切换到「正则表达式」搜索模式(VS Code点搜索框的
.*图标,Notepad++选「正则表达式」选项) - 先试试这个通用规则:搜索栏输入
(?<![0-9])\n,替换栏留空,点击「全部替换」
(原理:正常行最后一个字段是手机号(数字),被拆分的行结尾是地址的一部分,不是数字,这个规则会把这些行的换行符去掉,和下一行合并) - 如果遇到地址里带数字的特殊情况,换个精准规则:搜索
(^(?:[^,]*,){2}[^,]*)\n,替换为$1,重复替换直到没有匹配项。这个规则专门找只有2个逗号的不完整行,把它和下一行合并成完整记录。
方法2:用Python脚本(适合有基础的用户,大文件效率拉满)
百万级别的文件用脚本处理最稳,还能应对复杂情况(比如地址里带逗号),直接复制下面的代码改个文件路径就行:
import csv # 这里改成你的输入输出文件路径 input_file = "损坏的文件.csv" output_file = "修复后的文件.csv" with open(input_file, 'r', encoding='utf-8') as infile, open(output_file, 'w', encoding='utf-8', newline='') as outfile: writer = csv.writer(outfile) current_row = [] for line in infile: stripped_line = line.strip() if not stripped_line: continue # 拆分当前行的字段 fields = [f.strip() for f in stripped_line.split(',')] # 判断是不是新的记录:第一个字段是数字(对应sno列) if fields[0].isdigit(): # 如果上一条记录还没写完,先写入文件 if current_row: writer.writerow(current_row) current_row = fields else: # 把拆分的内容合并到上一行的地址字段 if current_row: current_row[2] += fields[0] # address是第3列,索引从0开始是2 # 如果当前行还有手机号,直接补上 if len(fields) > 1: current_row[3] = fields[1] # 写入最后一条记录 if current_row: writer.writerow(current_row)
运行前记得备份原文件,跑起来之后你该干嘛干嘛,百万行分分钟就能处理完。
方法3:用命令行sed工具(适合Linux/Mac用户,一行命令搞定)
打开终端,直接敲下面的命令,把broken.csv换成你的原文件名,fixed.csv是修复后的文件:
sed -e :a -e '/,.*,.*,/!{N;ba' -e '}' broken.csv > fixed.csv
这个命令会自动识别字段不完整的行(没有3个逗号的行),自动把它和下一行合并,直到形成完整的4字段记录,全程不用你操心细节。
重要提醒
- 不管用哪种方法,先备份原文件! 百万行数据出错了真的很难救
- 如果你的CSV里有带逗号的字段(比如地址是
"Kolkata, West Bengal"),优先用Python脚本的方法,因为正则和sed可能会误判
备注:内容来源于stack exchange,提问作者Jagapathibabu
相关产品推荐
相关产品推荐

