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

如何用Pandas将CSV文件中多行无序数据合并为单行?

优雅处理格式混乱的CSV记录合并问题

这绝对是CSV数据清理里很常见的头疼场景,我给你准备了一个用Python实现的简洁方案,完美解决你遇到的「记录拆分多行、首尾带分号」的问题:

核心思路

  1. 识别记录边界:通过每行开头的数字)(比如1)、2))判断新记录的起始
  2. 拼接分散行:把属于同一条记录的所有行内容合并成一个字符串
  3. 格式化清理:去掉多余的分号、调整空格,最终输出规范的单行记录

完整实现代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:22:03