求助:解决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
相关产品推荐
相关产品推荐

