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

求助:解决Pandas读取含内部分隔符的SAP导出TXT文件异常问题

遇到这种SAP导出文本里分隔符出现在字段内容中的问题确实很头疼,不过我们可以从两个方向来解决,优先尝试最省心的方案,不行再用手动处理的办法:

方案1:调整SAP导出设置(最优解)

如果你们有权限调整SAP的导出参数,强烈建议在导出时启用文本限定符(比如双引号"),让SAP自动把包含分隔符|的字段用引号包裹起来。这样你只需要修改read_csv的参数就能直接正确读取:

def exporting_xlsx(file_name, xlsx_path):
    df = pd.read_csv(
        file_name, 
        delimiter='|', 
        index_col=False, 
        header=0, 
        dtype=str,
        quotechar='"',  # 关键参数:指定文本限定符
        skipinitialspace=True,
        low_memory=False,
        skip_blank_lines=True
    )
    df = df.loc[:, ~df.columns.str.contains('^Unnamed')]
    df.to_excel(xlsx_path, index=None, header=True)

这样pandas会自动识别引号内的|是字段内容的一部分,不会当作分隔符处理,完美解决列数不匹配的问题。

方案2:手动处理每行数据(如果无法调整SAP导出)

如果没法修改SAP的导出设置,我们可以手动读取每一行,拆分后把多余的部分合并回最后一个字段——从你的示例数据看,只有最后一列(Short Text)会包含|,前几列都是固定格式不会出现分隔符,所以这个方法很可靠:

import pandas as pd

def fix_malformed_line(line, expected_columns):
    # 按分隔符拆分行
    parts = line.strip().split('|')
    # 如果列数匹配,直接返回
    if len(parts) == expected_columns:
        return parts
    # 前expected_columns-1个部分保留,剩下的用|合并成最后一列
    fixed_parts = parts[:expected_columns-1] + ['|'.join(parts[expected_columns-1:])]
    return fixed_parts

def exporting_xlsx(file_name, xlsx_path):
    # 先读取表头确定预期列数
    with open(file_name, 'r', encoding='utf-8') as f:
        # 注意:如果SAP导出是cp1252编码,把encoding改成'cp1252'
        header = f.readline().strip().split('|')
        expected_columns = len(header)
        
        # 逐行处理数据
        processed_rows = []
        for line in f:
            stripped_line = line.strip()
            if not stripped_line:  # 跳过空行
                continue
            processed_rows.append(fix_malformed_line(stripped_line, expected_columns))
    
    # 创建DataFrame并导出
    df = pd.DataFrame(processed_rows, columns=header)
    df = df.loc[:, ~df.columns.str.contains('^Unnamed')]
    df.to_excel(xlsx_path, index=None, header=True)

这个方法会保留所有行,不会像on_bad_lines='warn'那样跳过数据,而且不管最后一列有多少个|,都会被正确合并成一个字段。

另外,你之前尝试的read_fwf之所以没生效,是因为这些数据的列宽其实不固定(最后一列长度差异很大),所以不适合用固定宽度读取的方式。

内容的提问来源于stack exchange,提问作者FabledFalcons

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 02:17:38