如何在Informatica中拆分FlatFile的Header、Footer、Trailer并加载数据至数据库
拆分FlatFile并加载有效数据到数据库的实现方案
前置逻辑说明
你给出的FlatFile有明确的结构化特征:
- 首行是Header行,固定以
HEADER开头 - 尾行是Footer行,固定值为
Footer - 倒数第二行是Trailer行,固定以
Trailer开头附带总记录数 - Header和Trailer之间的所有行都是有效业务数据
具体实现步骤
1. 拆分文件各部分
如果是小文件,直接全量读取拆分即可,示例代码(Python):
# 读取文件所有行,自动过滤空行、去除首尾换行符 with open("target_flat_file.dat", "r", encoding="utf-8") as f: all_lines = [line.strip() for line in f if line.strip()] # 按位置拆分各部分 header = all_lines[0] trailer = all_lines[-2] footer = all_lines[-1] # 提取中间有效数据行 valid_records = all_lines[1:-2]
如果是GB级以上大文件,避免全量读取占满内存,可以先遍历一次统计总行数,第二次遍历按行号拆分即可。
如果文件结构不固定、可能插入空白行/调整位置,可以用关键字匹配的方式拆分,兼容性更强:
header = None trailer = None footer = None valid_records = [] with open("target_flat_file.dat", "r", encoding="utf-8") as f: for line in f: line = line.strip() if not line: continue if line.startswith("HEADER "): header = line elif line.startswith("Trailer "): trailer = line elif line == "Footer": footer = line else: valid_records.append(line)
2. 数据合法性校验(推荐必做)
- 提取Trailer中的
total_rec_count数值,和len(valid_records)比对,如果不一致说明文件传输过程中丢包、数据损坏,直接终止流程报错即可 - 可额外校验Header中的批次号、日期字段是否符合预期,避免加载错误批次的文件
3. 解析数据并批量入库
按你实际的业务规则解析每条有效数据行(比如按分隔符拆分、按固定宽度截取字段),之后用批量插入的方式加载到数据库,性能远高于单条插入,示例:
import pymysql # 假设每条数据行是竖线分隔的3个字段:用户ID、用户名、用户年龄 parsed_data = [] for rec in valid_records: user_id, user_name, user_age = rec.split("|") parsed_data.append((int(user_id), user_name, int(user_age))) # 批量插入MySQL示例 conn = pymysql.connect(host="你的数据库地址", user="用户名", password="密码", database="库名") cursor = conn.cursor() cursor.executemany("INSERT INTO user_info (user_id, user_name, user_age) VALUES (%s, %s, %s)", parsed_data) conn.commit() cursor.close() conn.close()
内容的提问来源于stack exchange,提问作者nithin
相关产品推荐
相关产品推荐

