同HEADER格式多数据集拼接:提取指定块合并并更新TAIL计数
同编号多HEADER数据块拼接实现方案
核心处理规则
完全匹配业务需求的处理逻辑:
- 按块拆分原文件内容:每块以
HEAD 编号 后缀为起始标识,以同编号的TAIL 编号 记录数为结束标识,中间的所有非HEAD/TAIL行即为块主体记录。 - 按块编号做分组归集:
- 仅出现1次的编号块:完全保留原有内容,不做修改,按原文件中的出现顺序排在输出结果前段。
- 出现多次的编号块:
- 仅保留1次该编号对应的HEAD行,删除其余重复的同编号HEAD行
- 按原出现顺序拼接所有同编号块的主体记录,不做记录去重
- 统计拼接后主体记录的总条数,将TAIL行的末尾数字替换为两位补零的总条数,仅保留1次更新后的TAIL行,删除其余重复的同编号TAIL行
- 输出排序:所有单块内容按原顺序前置,最后追加合并完成的多块内容,与示例输出顺序完全一致。
可直接落地的参考实现
运行下方Python代码即可完成上述处理,处理示例输入后输出结果和给定预期完全匹配:
def merge_same_id_blocks(file_path): multi_block_cache = {} current_reading_block = {"id": "", "head_line": "", "body_lines": []} with open(file_path, 'r', encoding='utf-8') as f: all_lines = [line.rstrip('\n') for line in f if line.strip()] for line in all_lines: if line.startswith("HEAD"): # 完成上一个块的归集 if current_reading_block["id"]: block_id = current_reading_block["id"] if block_id not in multi_block_cache: multi_block_cache[block_id] = { "head": current_reading_block["head_line"], "body": current_reading_block["body_lines"], "is_single": True } else: multi_block_cache[block_id]["is_single"] = False multi_block_cache[block_id]["body"].extend(current_reading_block["body_lines"]) # 初始化新块读取状态 line_parts = line.split() current_reading_block = { "id": line_parts[1], "head_line": line, "body_lines": [] } elif line.startswith("TAIL"): # 完成当前块的归集 block_id = current_reading_block["id"] if block_id not in multi_block_cache: multi_block_cache[block_id] = { "head": current_reading_block["head_line"], "body": current_reading_block["body_lines"], "is_single": True } else: multi_block_cache[block_id]["is_single"] = False multi_block_cache[block_id]["body"].extend(current_reading_block["body_lines"]) # 重置块读取状态 current_reading_block = {"id": "", "head_line": "", "body_lines": []} else: # 普通主体行追加到当前块 current_reading_block["body_lines"].append(line) # 组装最终输出 output = [] # 先输出所有单块 for block_id, block_content in multi_block_cache.items(): if block_content["is_single"]: output.append(block_content["head"]) output.extend(block_content["body"]) output.append(f"TAIL {block_id} {len(block_content['body']):02d}") # 再输出所有合并后的多块 for block_id, block_content in multi_block_cache.items(): if not block_content["is_single"]: output.append(block_content["head"]) output.extend(block_content["body"]) output.append(f"TAIL {block_id} {len(block_content['body']):02d}") return "\n".join(output)
效果校验
针对题中的示例输入,代码会自动计算0001编号块的主体总条数:第一块3条记录、第二块5条记录,合并后共8条,最终生成的TAIL行为TAIL 0001 08,整体输出顺序和格式与给定预期完全一致。
内容的提问来源于stack exchange,提问作者John Bailey
相关产品推荐
相关产品推荐

