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

使用Python修复无引号CSV文件中行内CRLF导致的行拆分问题

使用Python修复无引号CSV文件中行内CRLF导致的行拆分问题

看起来你碰到了无引号分隔文本文件里的经典坑——字段里的换行符直接把一条完整记录拆成了好几行,导致列数和表头对不上。别担心,我给你一个针对性的Python解决方案,核心思路是根据表头的预期列数来判断行是否完整,把拆分的行合并回原记录。

解决方案代码

def fix_line_breaks(input_file_path, output_file_path, delimiter='~'):
    # 打开输入输出文件,指定newline=''避免自动转换换行符
    with open(input_file_path, 'r', newline='') as infile, open(output_file_path, 'w', newline='') as outfile:
        # 读取表头并计算预期列数
        header = infile.readline().strip()
        expected_cols = len(header.split(delimiter))
        # 先把表头写入输出文件
        outfile.write(header + '\n')
        
        # 缓存正在构建的不完整记录
        incomplete_record = []
        
        for line in infile:
            # 只去掉行尾的CR/LF,保留字段内的换行内容
            cleaned_line = line.rstrip('\r\n')
            line_parts = cleaned_line.split(delimiter)
            
            if not incomplete_record:
                # 还没有缓存的不完整记录,直接存入
                incomplete_record = line_parts
            else:
                # 检查合并当前行后是否能凑够预期列数
                if len(incomplete_record) + len(line_parts) - 1 == expected_cols:
                    # 当前行的第一部分属于上一个字段,剩下的是新字段
                    incomplete_record[-1] += '\n' + line_parts[0]
                    incomplete_record.extend(line_parts[1:])
                    # 记录完整了,写入文件
                    outfile.write(delimiter.join(incomplete_record) + '\n')
                    # 重置缓存
                    incomplete_record = []
                else:
                    # 当前行全部属于上一个字段,直接追加
                    incomplete_record[-1] += '\n' + cleaned_line
        
        # 处理最后一条可能遗留的完整记录
        if incomplete_record and len(incomplete_record) == expected_cols:
            outfile.write(delimiter.join(incomplete_record) + '\n')

# 调用示例:替换成你的输入输出文件路径
fix_line_breaks('source_data.txt', 'fixed_data.txt', delimiter='~')

代码逻辑说明

  1. 基准列数确定:先读取表头,拆分后得到每条记录应该有的列数(你的示例里是5列)。
  2. 不完整记录缓存:用incomplete_record变量临时存储还没凑够列数的拆分记录。
  3. 逐行处理:
    • 如果缓存为空,直接把当前行拆分后存入缓存。
    • 如果缓存已有内容,说明当前行是上一条记录的延续:
      • 要是合并后能凑够预期列数,就把当前行的第一部分追加到缓存的最后一个字段,剩下的部分作为新字段加入缓存,然后写入完整记录并重置缓存。
      • 要是还不够,就把当前行的全部内容追加到缓存的最后一个字段。
  4. 收尾处理:最后检查是否有遗留的完整记录,确保没有遗漏。

注意事项

  • 这个方案默认只有最后一个字段会出现行内换行(和你的示例数据匹配),如果其他字段也可能有换行,需要调整判断逻辑。
  • 如果你的字段里包含分隔符~,这个方案会失效——这种情况建议改用带引号的CSV格式,但你的问题里是无引号场景,所以暂时适用。
  • 测试时可以先用你的示例数据跑一遍,修复后的第三条记录会把拆分的三行description合并成一个字段,列数和表头一致。

备注:内容来源于stack exchange,提问作者curry_b

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 16:03:14