使用Python提取TXT文件中ETP行指定字段并格式化日期
需求可行性确认
这个需求用Python完全可以实现,仅依赖Python内置标准库就能完成,不需要额外安装第三方工具,逻辑清晰,对初学者来说上手难度很低。
分步实现思路
- 读取与初筛数据
用内置open()函数逐行读取TXT文件,逐行判断是否包含ETP标识,直接跳过BA6、TDO、ANC等其他标识开头的无关行,逐行读取的方式不会因为文件过大占用过多内存。 - 拆分结构化字段
对筛选出的ETP行,调用字符串的split('|')方法按竖线切分字段,切分后对每个字段做前后空白字符去除处理,避免空格、换行符干扰后续字段匹配。 - 提取ETP ID
从切分后的字段里找到包含ETP的字段,用正则r'ETP(\d{6})'直接匹配ETP后紧跟的6位数字即可,正则写法容错率高,不需要手动数位置做切片,适合初学者使用。 - 提取并格式化日期
从ETP字段所在位置向后遍历,依次找到两个独立的、值为6位纯数字的字段,就是需要的两个DDMMYY格式日期。如果要转成斜杠分隔格式,不需要调用复杂的日期处理库,直接做字符串切片拼接即可:6位字符串前2位是日、中间2位是月、最后2位是年,按日/月/年拼接就得到DD/MM/YY格式的结果。 - 提取金额字段
从第二个日期所在位置继续向后遍历,第一个匹配到的有效数字金额就是首金额;继续向后遍历跳过值为0的金额,第一个遇到的非0有效数字就是需要提取的非0金额。两个金额都提取完成后可以直接终止当前行的遍历,提升处理效率。 - 结果输出
把提取到的ETP ID、两个日期、两个金额按要求用|拼接,既可以直接打印到控制台查看,也可以写入新的结果文件保存。
参考实现代码
import re # 替换为你自己的文件路径 INPUT_PATH = "你的原始数据文件.txt" OUTPUT_PATH = "处理结果.txt" # 匹配ETP后6位ID的正则规则 etp_match = re.compile(r'ETP(\d{6})') with open(INPUT_PATH, 'r', encoding='utf-8') as f_in, open(OUTPUT_PATH, 'w', encoding='utf-8') as f_out: # 写入结果表头 f_out.write("ETP ID | 原日期1 | 原日期2 | 首金额 | 非0金额\n") for line in f_in: line = line.strip() # 跳过非ETP行 if 'ETP' not in line: continue # 按竖线拆分字段,去除每个字段前后的空白字符 fields = [field.strip() for field in line.split('|')] # 查找ETP ID和所在位置 etp_id = None etp_pos = None for idx, field in enumerate(fields): res = etp_match.search(field) if res: etp_id = res.group(1) etp_pos = idx break if not etp_id: continue date_col = [] first_amount = None non_zero_amount = None # 从ETP字段后开始遍历找目标值 for field in fields[etp_pos+1:]: # 先收集两个6位日期 if len(date_col) < 2 and field.isdigit() and len(field) == 6: date_col.append(field) continue # 找完两个日期再收集金额 if len(date_col) == 2: # 处理金额,去除千分位逗号后转浮点数,可根据实际数据规则调整 try: amount = float(field.replace(',', '')) except: continue # 记录第一个金额 if first_amount is None: first_amount = amount # 记录第一个非0金额 if non_zero_amount is None and amount != 0: non_zero_amount = amount # 两个金额都找齐就提前结束当前行遍历 if first_amount is not None and non_zero_amount is not None: break # 所有字段齐全才写入结果 if len(date_col) == 2 and first_amount is not None and non_zero_amount is not None: # 要转斜杠日期就替换下面的date_col[0]、date_col[1]为切片拼接结果 # 例:date1 = f"{date_col[0][:2]}/{date_col[0][2:4]}/{date_col[0][4:]}" res_line = f"{etp_id} | {date_col[0]} | {date_col[1]} | {first_amount} | {non_zero_amount}\n" f_out.write(res_line)
如果实际数据中的金额带货币符号等特殊字符,只需要在金额转数字的步骤加一步对应符号的替换即可;如果运行时出现字段匹配缺失的问题,可以先打印切分后的fields列表查看实际结构,微调判断规则就能适配。
内容的提问来源于stack exchange,提问作者Saeym Estrada
相关产品推荐
相关产品推荐

