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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 06:03:37