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

如何解析含重复块的文本文件并制表,解决pandas数组长度不一致报错

问题原因

你当前代码的核心问题是没有按「数据块-块内条目」的层级处理数据:

  • 每个以GSHSH = x OK:SUCCESS开头的是独立数据块,每个块内的前5个公共字段仅出现1次,但同一个块下可能对应多条以MHGT开头的明细条目
  • 你直接把所有键值对按Key追加到列表,导致公共字段的列表长度远小于明细字段的列表长度,转DataFrame时因数组长度不一致报错。

解决代码

import re
import pandas as pd

file = 'file.txt'
with open(file, 'r', encoding='utf-8') as f:
    lines = f.read().splitlines()

# 第一步:拆分所有数据块,每个块以GSHSH行开头,到下一个GSHSH行之前结束
blocks = []
current_block = []
for line in lines:
    if line.startswith('GSHSH = '):
        if current_block:
            blocks.append(current_block)
        current_block = [line]
    else:
        if current_block:
            current_block.append(line)
if current_block:
    blocks.append(current_block)

# 第二步:逐个处理每个块,生成每行的完整数据
all_rows = []
for block in blocks:
    common_fields = {}
    current_row = None
    for line in block:
        # 只处理带=的有效行
        if '=' not in line:
            continue
        # 拆分键值,去除空格
        k, v = [i.strip() for i in line.split('=', 1)]
        # 处理公共字段:第一个MHGT出现前的都是公共字段
        if k == 'MHGT' and current_row is None:
            # 公共字段收集完成,开始生成第一条明细行
            current_row = common_fields.copy()
            current_row[k] = v
        elif k == 'MHGT' and current_row is not None:
            # 遇到新的MHGT,保存上一行,新起一行
            all_rows.append(current_row)
            current_row = common_fields.copy()
            current_row[k] = v
        elif current_row is None:
            # 还没到MHGT,存入公共字段
            common_fields[k] = v
        else:
            # 存入当前明细行的字段
            current_row[k] = v
    # 块处理完,保存最后一行(如果有)
    if current_row is not None:
        all_rows.append(current_row)

# 第三步:转DataFrame,缺失值可按需填充
df = pd.DataFrame(all_rows)
# 如果需要全局向下填充空缺字段,可开启下面这行
# df = df.ffill()
print(df)
# 输出制表格式可选
# print(df.to_markdown(tablefmt="grid"))

代码说明

  1. 先按GSHSH行分割原始文件为独立数据块,避免不同块的字段混淆
  2. 每个块内先收集MHGT出现前的所有公共字段,遇到第一个MHGT后开始生成明细行,每遇到新的MHGT就复制公共字段生成新行
  3. 所有行的字段结构统一后再转DataFrame,不会再出现长度不一致的报错
  4. 若需要处理不同块的字段差异(比如有的块是KKJW有的是TKKJW),可以在转完DataFrame后自行合并字段或者用ffill()向下填充空缺值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:39:04