レジストリの解析と自動化
TL;DR(ドクター)
信頼できる「検証」の自動化は、決定論的な摂取(安全な配達、偶像性、整合性制御)、正規化されたデータ層(単一スキーム、マッチングキー、標準化された時間/通貨/標識単位)、厳格な品質規律(検証、許容、DLQ、アラート、自動修正)の3つの柱に基づいています。目標は、可用性にSLAとの和解、レポート、BIのための安定したテーブルにモトリーファイル/webhookを有効にすることです。
1)ソースとフォーマットのランドスケープ
1.1ソース
PSP/acquirers/aggregators:トランザクション、セット、コミッション、紛争。
銀行: 抽出MT940、 ISO 20022 CAMT。052/053/054、 PAIN支払い。001/002.
AWS/wallets/payouts (OCT/RTP/SEPA): payoutレジスタ、リターン。
Crypto-custom/exchange:オンチェーントランザクション、コンバージョン/コミッションレポート。
税金/州ポータル:CSV/XLSX/PDF、時々スクリプト化されたブラウザを介して。
1.2つのフォーマット
JSON-API/NDJSON(増分アップロード、カーソル)
CSV/TSV(可変区切り、ロケール、エンコーディング)。
XLSX(マルチシート、マージされたセル)。
XML (ISO 20022 CAMT/PAIN、 XSDカスタムスキーマ)。
SWIFT MT940/942(位置フィールド)。
PDF(表形式-パーサ;スキャン-OCR)。
ZIP/TAR。GZ(マルチファイルバッチ)。
2) Ingestionパイプラインアーキテクチャ
輪郭:1.ランディング:安全なファイル受け入れ(SFTP/FTPS/WebDAV/API/Webhook)→すぐにチェックサムを考慮し、原材料を常に保持します。
2.Raw:日付/プロバイダ/バッチ、バージョンのストレージによるレイアウト。
3.正規化:解析→統一型/単位→正規化されたテーブル。
4.検証:検証後(品質規則)→フラグ、DLQ。
5.マッチ:内部イベント/バンクへのマッピング。
6.サービング/BI:和解/財務/取引のためのケースを表示します。
主な要件:- idempotency of ingestion: '(provider、 file_name、 file_size、 checksum、 statement_date)'→a unique key。
- Reruns/Retrays:ファイルを再実行しても重複は作成されません。
- DLQ(デッドレターキュー):認識されていない/違反するすべてのルール-孤立したキューへ。
- バージョン管理:同じ日の新しいファイル→前のファイルへのリンクがある新しいバージョン。
3)配達および秘密の保証
チャネル:限られたキーが付いているSFTP;FTPS-厳密なTLSとだけ;API-OAuth2/short TTLトークン。
コンテンツ暗号化:ファイルをダウンロードするときのPGP/GPG;メールインボックスのS/MIME(使用されている場合)。
Integrity check: SHA-256/512チェックサム、マニフェストのハッシュとの比較。
秘密:Vault/KMSに保存、回転、設定ファイル/ログで禁止。
アクセス: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.XLSX×2
シートのホワイトリストによる読書;Auto Merge Inhibit-マージされたセルを平らにします。
数式を値に変換する。explicit TZでExcel→UTC日付。
5.3 XML (ISO 20022 CAMT/PAIN)
XSDによる検証;XPath IDマッピング('<Ntry>'、 '<TxDtls>'、 '<Amt>'、 '<CdtDbtInd>')。
クレジット/デビット正規化→記号;複数の'<Chrgs>'、 '<RmtInf>'をサポートしています。
5.4 MT940
タグ':61:'、':86:';国民の延長のためのサポート;位置フィールド→スライスルール。
複数の':61:'を1つのバッチに統合。
5.5 JSON/NDJSON/API
5.6 PDF/OCR
まず、テーブル解析(テーブル検出器)を試行し、ホワイトリスト文字を持つOCR (Tesseract)のみを試行します。
ポストバリデーション:金額、制御合計、行の数の調整。
5.7アーカイブ/バッチ
構造の保存とUnpacking;各ファイル-別個の'file_id';マニフェスト、すべての部品の制御。
6)データ品質の検証とルール
必須チェック:- スキーマ-すべての必須フィールドが存在します。
- タイプ:量-数値、日付-解析。
- チェックサム/合計-行の合計=ファイル内の合計(もしあれば)。
- 範囲:適度な窓の日付;sum> 0(または許可された負の辞書による)。
- 一意性:'(プロバイダ、provider_txid、シーケンス)'は正規化では重複しません。
- 許容は「amount/fx/time」の相違が許容される。
結果:'VALID'、 'VALID_WITH_WARNINGS'、 'INVALID→DLQ (reason_code)'。
7)アイデンティティと重複除外
Ingestion key: '(provider、 file_name、 filesize、 checksum、 statement_date)'→単一の'file_id'。
行レベルのidem: 'row_hash=sha256 (normalized_row_compact)';再ロードしても新しいレコードは作成されません。
Webhooks/API: 'idempotency_key'プロバイダ+タグ('exec_id')、 TTLを保存します。
プロバイダの重複:'provider_txid'+'sequence'によるdedup (DLQ_DUPLICATEでの矛盾の場合)。
8)オーケストレーションとスケジュール
Airflow/Dagster (DAG: 'fetch→decrypt→parse→normalize→validate→publish→match')。
SLA/SLO: 'Time-to-Availability (TtA)'ファイルの発生から'normalized=READY'まで。
レトライ:指数関数バックオフ+ジッタ;限界を試みる;ステータスをクリアします。
同時性と分離:重いOCR/解析 XLSX-CPU/RAM制限のある個別のプール/ワーカーで。
DLQ-replay:規則/マッピングを更新するときの定期的な再処理。
9) Observabilityおよび警報
メトリクス:- Ingestion Success%、 Parse Success% by source。
- TtA p50/p95、スループット(ライン/分)。
- DLQレートエージングDLQ p50/p95。
- スキーマドリフトインシデント。
- 「provider_txid」の重複率。
- 'TtA p95> SLA'→P1。
- 'DLQ Rate> 2%'→プロバイダーP 1の1時間あたり。
- 'Schema Drift detected'→P0(ソースによる自動マッチングを停止)。
- 'Duplicate spike'→P2 (check provider/webhooks)。
Dashbord:ファネルのファイル→rows_raw→rows_norm→rows_valid→rows_matched'、理由からDLQカード、TtA-quantles。
10)自動補正とマッピング
ヘッダーエイリアス:バージョンのある辞書(例:'Amount'→'amt'、'AMOUNT'→'amt')。
11) 「PSP決済とレポートの調整」へのリンク"
Ready normalized layer-マッチング(provider_txid/merchant_ref/fuzzy)、 diff-taxonomy、 auto-logs、 settlement↔bank -stitchingのための入力。キーフィールド:'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) Parser擬似コード
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(フォールバック):
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/email/phone→'sha256+salt'、ログ-プライマリ値なし。
保持ポリシー:ソースタイプ(AML/accounting)による'保持'。
PIIアクセス-役割のみ;読み取り/エクスポートの監査。
15) KPIとターゲット(パース/インジェクション)
摂取成功%≥ 99。ソースあたり5%/日。
Parse Success% ≥ 99%、 DLQ ≤ 1%。
TtA p95 (fayl→normalized) ≤ 15分(CSV/XML)、 ≤ 60分(PDF/OCR)。
スキーマドリフトインシデント:アラート/修正なしの0/月。
Duplicate Rate 'provider_txid' ≤ 0。05%.
16)インシデントプレイブック
スキーマドリフト:自動マッチングを停止し、スピーカーのML検出で「ソフト」パーサーをオンにし、エイリアスパッチを準備し、DLQリプレイを実行します。
DLQサージ:最新のファイルをデバッグし、エンコード/ロケール/記号をチェックし、一時的に公差の重大度を下げます(フラグ付き)。
SFTP遅延:API ポーリング/webhookへの切り替え、リトレースの増加、プロバイダとの通信。
スパイクの重複:追加の検証'row_hash'を有効にします。
17)テストケースパッケージ(UAT/Prod-Ready)
1.Idempotency:同じロード→1 'file_id'、 0行を繰り返します。
2.ロケール:'、'/'を持つファイル。'/spaces→正しい和。
3.部分的/払い戻し:1つの'provider_txid'に複数の'sequence'。
4.XML XSD:無効なCAMT→'INVALID'+DLQ。
5.MT940バリエーション:国家拡張→正しい分析。
6.PDF→OCR:ノイズでスキャン→基本ルールを抽出して渡す。
7.スキーマドリフト:新しいヘッダー→エイリアスパッチと履歴ファイルの再処理。
8.スループット:Nファイル/時間の負荷テスト→TtA SLAへの準拠。
9.PIIエディション:PAN/電子メールなしのログ、ハッシュのみ。
18)実装チェックリスト
- ソースレジストリ:プロトコル、スケジュール、SLA、フォーマット、連絡先。
- セキュアチャネル(SFTP/PGP/API)、秘密の保管庫。
- Idempotent ingestion+チェックサム+バージョン。
- フォーマット、エイリアス辞書、署名/ロケールポリシーによるパーサ。
- 正規化されたレイヤーとキーインデックス。
- 検証ルール、公差、DLQ、リプレイ。
- オーケストレーター(DAG)、レトライ/バックオフ、リソースプール。
- オブザビリティ:メトリック、ダッシュボード、アラート。
- GDPR/PIIマスキング、アクセス監査。
- テストケースと通常のスキーマドリフトドリル。
履歴書のサマリー
解析の自動化は「パーサを書く」ことではなく、信頼性の高い配信と暗号化、特異なパイプライン、厳格な正規化、品質規則、透明なアラートなどの産業回路を構築することです。このようなアウトラインは、データの可用性に関する保証されたSLAを使用して、すべてのレジスタを予測可能なテーブルに変換します。