注册表解析和自动化
TL;DR
可靠的"焊接"自动化建立在三条鲸鱼上:确定性输入(安全交付,等效性,完整性控制),标准化数据层(单个电路,匹配密钥,标准化的时间/货币/符号单位)和严格的质量纪律(验证,tolerance,DLQ,Alerta,自动校正)。目的是将杂项文件/webhooks转换为稳定的表,以与SLA进行匹配,报告和BI。
1)源和格式的景观
1.1个来源
PSP/收购者/聚合器:交易,设置,佣金,分配。
银行: MT940对账单,ISO 20022 CAMT。052/053/054,PAIN付款。001/002.
ARM/钱包/付款(OCT/RTP/SEPA):付款登记册,退款。
Crypto Castody/Exchange:电子交易,转换/佣金报告。
税收/政府。门户:CSV/XLSX/PDF,有时通过脚本浏览器。
1.2种格式
CSV/TSV(可变分隔符,位点,编码)。
XLSX(多缝合,组合单元)。
XML(ISO 20022 CAMT/PAIN,XSD定制sche-me)。
SWIFT MT940/942(位置字段)。
JSON-API/NDJSON(增量上载、游标)。
PDF(表格解析器;扫描-OCR)。
ZIP/TAR.GZ(多文件蹦床)。
2) ingestion-pipline架构
轮廓:1.Landing:安全接收文件(SFTP/FTPS/WebDAV/API/webhooks) →立即考虑使用checksum,我们始终保留原材料。
2.Raw:按日期/提供商/蹦床布局,保留版本。
3.Normalize:对类型→单位进行分类→统一化表。
4.验证:后验证(质量规则)→标志,DLQ。
5.匹配:与内部事件/银行匹配。
6.Serving/BI:对账/财务/交易的展示。
关键要求:- 等效性ingestion: '(provider, file_name, file_size, checksum, statement_date)'→唯一的钥匙。
- 重播/转发:重新运行文件不会产生双倍。
- DLQ (dead-letter queue):所有未知/违反规则的人都进入孤立的队列。
- Version:当天的新文件→参考上一版本的新版本。
3)交货和秘密安全
通道:密钥有限的SFTP;FTPS-仅在严格的TLS下;API是具有短TTL的OAuth2/令牌。
内容加密:下载文件时的PGP/GPG;S/MIME用于电子邮件收件箱(如果使用)。
完整性控制:SHA-256/512 checksum,与清单中的哈希进行比较。
保密:保存在Vault/KMS中,轮换,禁止在config 文件/logs中。
可用性:RBAC+"最小特权"原则,单独的服务帐户。
4)标准化和数据模式
4.1通用规则
时间:ISO-8601始终是UTC;对于定居日期-没有TZ的"DATE"。
总和:小单位中的"DECIMAL(p,s)"+单独的"规模";符号:严格按字典排列/消耗。
货币:ISO-4217,带有"fx_src"的固定汇率表。
Locali:禁止自动测试是分隔符/小数点/千分的显式设置。
编码:输入UTF-8;其他的-转换与日志。
4.2归一化的"平面"层(示例)
json
{
"provider": "Acquirer_A",
"source_kind": "PSP_TX PSP_SETTLEMENT BANK WALLET CRYPTO",
"kind": "AUTH CAPTURE REFUND PAYOUT FEE SETTLEMENT CHARGEBACK",
"payment_id": "pay_123", // ваше
"provider_txid": "psp_abc_789", // внешнее
"merchant_ref": "mr_456",
"sequence": 0, // partial/refund line index
"amount_minor": 100000, // 1000.00
"currency": "EUR",
"fee_minor": 120, // 1.20
"fx_rate": 1.0000,
"fx_src": "PSP ECB BANK",
"event_ts": "2025-11-03T12:00:00Z",
"value_date": "2025-11-05",
"account": "PSP_MERCHANT_CARD_A",
"bin": "425000",
"last4": "1234",
"status": "APPROVED CAPTURED SUCCESS FAILED SETTLED",
"file_id": "ing_20251103_001",
"row_hash": "sha256(raw_row)"
}
5)按格式划分的解析器: 技术和耙子
5.1 CSV/TSV
明确设置"delimiter"、"quotechar"、"escapechar"、"encoding"。
5.2 XLSX
通过表白主义者阅读;禁止自动关闭-使联合单元变平。
将公式转换为值;Excel → UTC日期带有显式TZ。
5.3 XML (ISO 20022 CAMT/PAIN)
通过XSD验证;XPath映射道具("<Ntry>,"<TxDtls>","<Amt>","<CdtDbtInd>")。
信用正常化/借阅→标志;支持多个"<Chrgs>,"<RmtInf>"。
5.4 MT940
标记解析为':61:',':86:';支持国家扩展;位置字段→滑动规则。
将多个':61:'合并为一个战斗。
5.5 JSON/NDJSON/API
5.6 PDF/OCR
首先尝试进行表格解调(tab检测器),然后仅尝试使用带有白色主义符号的OCR(Tesseract)。
后验证:总和,基准,行数核对。
5.7 Archives/Batchy
解压缩并保留结构;每个文件都是单独的"file_id";宣言,控制所有部分。
6)验证和数据质量规则
强制性检查:- 方案:存在所有请求字段。
- 类型:总和是数字,日期是错位的。
- 校验和:行和=文件中的总和(如果有)。
- 范围:明智窗口中的日期;总和>0(或可接受的负词典)。
- 唯一性:"(provider,provider_txid,序列)"在正常化中不重复。
- Tolerans:允许的"amount/fx/time"差异。
结果:"VALID","VALID_WITH_WARNINGS","INVALID → DLQ(reason_code)"。
7)相似性和重复数据消除
入口键:'(provider, file_name, filesize, checksum, statement_date)'→唯一的'file_id'。
Row-level idem: `row_hash = sha256(normalized_row_compact)`;重新加载不会创建新条目。
Webhooks/API:"idempotency_key"提供商+您的标签("exec_id"),存储TTL。
提供者的配对:"provider_txid"+"sequence"的后代,而差异则在DLQ_DUPLICATE中。
8)编排和时间表
Оркестратор: Airflow/Dagster (DAG: `fetch → decrypt → parse → normalize → validate → publish → match`).
SLA/SLO:从文件出现到"正常化=READY"的"时间到可用性(TtA)"。
Retrai:指数backoff+jitter;尝试限制;明确的状态。
并发和绝缘:XLSX的重型OCR/抛光-在单独的CPU/RAM限制池/操作员中。
DLQ-replay:更新规则/映射时,定期重新执行。
9)可观察性和异同
度量标准:- 按来源分列的Ingestion Success%、Parse Success%。
- TtA p50/p95,Throughput(行/分钟)。
- DLQ Rate и Aging DLQ p50/p95.
- Schema Drift Incidents(标题/格式更改)。
- Duplicate Rate по `provider_txid`.
- `TtA p95 > SLA` → P1.
- "DLQ Rate> 2%"按→ P1提供商每小时。
- "Schema Drift detected" → P0(通过源停止自动对决)。
- 'Duplicate spike' → P2(检查提供商/webhooks)。
Dashbord:漏斗'files ,DLQ卡出于原因,TtA量子。
10)自动校正和mappings
Header aliases: 版本字典(e.g., `Amount`→`amt`, `AMOUNT`→`amt`).
11)与"PSP支付和报告核对"的联系"
完成的规范化层是匹配的输入(provider_txid/merchant_ref/fuzzy),diff分类法计算,自动日志和settlement↔bank字符。关键字段是:"provider_txid","sequence","kind","amount_minor","value_date","account"。
12)存储模型和表格
登录的文件表:sql
CREATE TABLE landed_files (
file_id TEXT PRIMARY KEY,
provider TEXT,
source_kind TEXT,
file_name TEXT,
file_size BIGINT,
checksum TEXT,
statement_date DATE,
received_at TIMESTAMP WITH TIME ZONE,
version INT,
status TEXT, -- RECEIVED PARSED FAILED error TEXT
);
归一化行:
sql
CREATE TABLE psp_norm (
row_id BIGSERIAL PRIMARY KEY,
file_id TEXT REFERENCES landed_files(file_id),
provider TEXT,
source_kind TEXT,
kind TEXT,
payment_id TEXT,
provider_txid TEXT,
merchant_ref TEXT,
sequence INT,
amount_minor BIGINT,
currency CHAR(3),
fee_minor BIGINT,
fx_rate NUMERIC(18,8),
fx_src TEXT,
event_ts TIMESTAMPTZ,
value_date DATE,
account TEXT,
status TEXT,
row_hash TEXT UNIQUE,
repair_flags TEXT[]
);
CREATE INDEX idx_psp_norm_txid ON psp_norm(provider, provider_txid, sequence);
13)解析器的伪代码
CSV/XLSX:
python def parse_table(file, spec):
df = load_csv_or_xlsx(file, delimiter=spec.delim, encoding=spec.enc, sheet=spec.sheet)
df = rename_headers(df, spec.header_aliases)
df = clean_amounts(df, thousand=spec.thousand, decimal=spec.decimal, sign_policy=spec.sign)
rows = []
for r in df.itertuples():
rows.append(normalize_row(r, spec))
return rows
XML CAMT:
python def parse_camt(xml):
root = parse_xml(xml, xsd="camt053.xsd")
for ntry in root.findall('.//Ntry'):
sign = 1 if ntry.findtext('CdtDbtInd') == 'CRDT' else -1 amt = Decimal(ntry.findtext('Amt')) sign
... map to normalized fields
OCR PDF (fallback):
python def parse_pdf_ocr(pdf):
text = tesseract(pdf, lang="eng", psm=6, whitelist="0123456789.,-;:/A-Za-z")
table = detect_table(text)
return normalize_table(table)
14) GDPR/PII和日志编辑
掩码/哈希:PAN/电子邮件/电话 → 'sha 256+salt',logi-没有主值。
保留策略:按源类型(AML/bukuchet)"保留"。
PII的访问权限仅限于角色;读数/导出审核。
15)KPI和目标(用于parsing/ingestion)
Ingestion Success % ≥ 99.每源5%/天。
Parse Success % ≥ 99%, DLQ ≤ 1%.
TtA p95(fayl→normalized)≤ 15分钟(CSV/XML),≤ 60分钟(PDF/OCR)。
Schema Drift Incidents:0/个月,没有警报/假人。
Duplicate Rate по `provider_txid` ≤ 0.05%.
16)事件花花公子
Schema drift:停止自动对决,打开带有ML扬声器检测器的"软"解析器,准备外来补丁,赶走DLQ-replay。
DLQ激增:调试最新文件,检查编码/位置/符号,暂时降低tolerans的严格(带有标志)。
SFTP延迟:切换到API-polling/webhook,增加转发,与提供商通信。
Spikes duplicates:启用"row_hash"多普查,重复块,直到澄清。
17)测试桉例包(UAT/Prod准备)
1.相同性:重复相同的下载→ 1'file_id',0条新行。
2.Locali:带有','/'/空格的文件→正确的金额。
3.Partial/refund:对一个"provider_txid"进行一些"序列"。
4.XML XSD:非验证CAMT → 'INVALID'+DLQ。
5.MT940变化:国家扩展→正确分析。
6.PDF→OCR:噪音扫描→提取和通过基本规则。
7.Schema drift:新的hader → alias补丁和历史文件的重新处理。
8.Throughput:负载测试N文件/小时→遵守TtA SLA。
9.PII修订版:没有PAN/电子邮件的博客,只有哈希。
18)实施支票
- 来源注册:协议、时间表、SLA、格式、联系人。
- 安全通道(SFTP/PGP/API), Vault for Secret。
- 异位输入+checksum+版本。
- 按格式,alias字典,标记/本地策略的解析器。
- 归一化层和密钥索引。
- 验证规则,tolerance,DLQ和replay。
- 管弦乐队(DAG),retrai/backoff,资源池。
- 可观察性:度量,dashbords,alertes。
- GDPR/PII掩码,访问审核。
- 测试桉例和常规模式驱动程序。
二.总结
解析自动化不是"写解析器",而是构建一个工业轮廓:可靠的交付和加密,等效派伊线,严格的规范化,质量规则和透明的差速器。这样的轮廓可以将任何注册表转换为可预测的表格,并在数据可用性方面有保证的SLA,这是交换、财务和管理报告的基础。