| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- import pandas as pd
- from tkinter import messagebox
- from flow_parser_base import FlowParserBase
- class ABCFlowParser(FlowParserBase):
- """农业银行流水解析器"""
-
- def parse(self, flow_file_path):
- """解析农行流水文件,返回标准化的流水数据"""
- try:
- flow_df = pd.read_excel(flow_file_path, dtype=str, header=2)
-
- flow_df.columns = flow_df.columns.str.strip()
-
- required_columns = ["交易时间", "收入金额", "支出金额", "账户余额", "对方账号", "对方户名", "对方开户行", "摘要"]
-
- missing_fields = [k for k in required_columns if k not in flow_df.columns]
- if missing_fields:
- messagebox.showerror("错误", f"农行流水缺少必要列:{missing_fields}")
- return None
-
- filtered_df = flow_df.copy()
- filtered_df = filtered_df[filtered_df["交易时间"].str.contains(r"\d{4}-\d{2}-\d{2}", na=False)]
-
- filtered_df["交易时间"] = pd.to_datetime(filtered_df["交易时间"], errors='coerce')
- filtered_df = filtered_df.sort_values("交易时间", ascending=True)
-
- standard_flow = []
- for _, row in filtered_df.iterrows():
- transaction_time = row["交易时间"]
- income_amount = pd.to_numeric(row["收入金额"], errors='coerce')
- expense_amount = pd.to_numeric(row["支出金额"], errors='coerce')
- balance = str(row["账户余额"]).strip()
- opponent_account = str(row["对方账号"]).strip()
- opponent_name = str(row["对方户名"]).strip()
- opponent_bank = str(row["对方开户行"]).strip()
- summary = str(row["摘要"]).strip()
-
- income = income_amount if pd.notna(income_amount) and income_amount > 0 else 0
- expense = expense_amount if pd.notna(expense_amount) and expense_amount > 0 else 0
-
- if summary == "费用外收":
- summary = "手续费"
- opponent_name = "手续费"
- opponent_bank = "手续费"
-
- transaction_time_str = transaction_time.strftime("%Y-%m-%d %H:%M:%S") if pd.notna(transaction_time) else ""
-
- standard_flow.append({
- "交易时间": transaction_time_str,
- "对方户名": opponent_name,
- "摘要": summary,
- "收入": income,
- "支出": expense,
- "对方开户机构": opponent_bank,
- "备注": opponent_bank,
- "余额": balance
- })
-
- return pd.DataFrame(standard_flow)
- except Exception as e:
- messagebox.showerror("错误", f"解析农行流水失败:{str(e)}")
- return None
-
- def get_bank_name(self):
- """返回银行名称"""
- return "农业银行"
|