如何用Pandas将CSV文件中多行无序数据合并为单行?
优雅处理格式混乱的CSV记录合并问题
这绝对是CSV数据清理里很常见的头疼场景,我给你准备了一个用Python实现的简洁方案,完美解决你遇到的「记录拆分多行、首尾带分号」的问题:
核心思路
- 识别记录边界:通过每行开头的
数字)(比如1)、2))判断新记录的起始 - 拼接分散行:把属于同一条记录的所有行内容合并成一个字符串
- 格式化清理:去掉多余的分号、调整空格,最终输出规范的单行记录
完整实现代码
import re def clean_messy_csv(input_file, output_file): # 读取所有行,过滤空行并去掉首尾空白 with open(input_file, 'r', encoding='utf-8') as f: lines = [line.strip() for line in f if line.strip()] cleaned_records = [] current_record = "" for line in lines: # 用正则匹配任意数字+右括号开头的行(新记录起始) if re.match(r'^\d+\) ', line): # 如果已有未完成的记录,先清理并存入列表 if current_record: # 清理首尾分号、合并连续分号、统一分隔符空格 cleaned = current_record.strip(';').replace(';;', ';').replace(' ; ', '; ') cleaned_records.append(cleaned) # 初始化新的记录 current_record = line else: # 把当前行追加到当前记录,先去掉首尾分号避免重复拼接 current_record += ' ' + line.strip(';') # 处理最后一条未完成的记录 if current_record: cleaned = current_record.strip(';').replace(';;', ';').replace(' ; ', '; ') cleaned_records.append(cleaned) # 写入输出文件,同时把开头的"1) "替换成"1; "匹配你要的格式 with open(output_file, 'w', encoding='utf-8') as f: for record in cleaned_records: formatted_record = record.replace(') ', '; ', 1) f.write(formatted_record + '\n') # 调用示例:替换成你的输入输出文件路径 clean_messy_csv('messy_input.csv', 'clean_output.csv')
关键细节说明
- 正则匹配起始行:用
re.match(r'^\d+\) ', line)可以兼容任意数字编号的记录,比硬编码1)、2)更通用 - 清理逻辑:
strip(';')去掉首尾多余分号,replace(';;', ';')合并连续的分号,replace(' ; ', '; ')统一分隔符的空格格式 - 格式转换:最后把
1) Pedestrian改成1; Pedestrian,完全匹配你给出的示例格式
如果你需要处理超大文件,也可以改成逐行流式处理(不用一次性加载所有行),避免内存压力,这个基础版本已经足够应对大部分场景啦。
内容的提问来源于stack exchange,提问作者Venkatesan Kanagaraj
相关产品推荐
相关产品推荐

