Parsowanie i automatyzacja rejestrów
TL; DR
Niezawodna automatyzacja „weryfikacji” opiera się na trzech filarach: deterministycznym spożyciu (bezpieczna dostawa, idempotencja, kontrola integralności), znormalizowanej warstwie danych (pojedynczy schemat, klucze dopasowujące, znormalizowane jednostki czasu/walut/znaków) oraz ścisłej dyscyplinie jakości (walidacje, tolerancje, DLQ, wpisy, korekty automatyczne). Celem jest przekształcenie plików motley/webhooks w stabilne tabele do pojednania, raportowania i BI z SLA na dostępność.
1) Krajobraz źródłowy i formatowy
1. 1 Źródła
PSP/jednostki przejmujące/agregatory: transakcje, zestawy, prowizje, spory.
Banki: wyciągi MT940, ISO 20022 CAMT. 052/053/054, płatności PAIN. 001/002.
AWS/portfele/wypłaty (OCT/RTP/SEPA): rejestry wypłat, zwroty.
Crypto-custom/exchanges: transakcje łańcuchowe, sprawozdania z konwersji/prowizji.
Podatki/portale państwowe: CSV/XLSX/PDF, czasami za pośrednictwem skryptowej przeglądarki.
1. 2 Formaty
CSV/TSV (separatory zmienne, lokalizacje, kodowanie).
XLSX (wielowarstwowe, połączone komórki).
XML (ISO 20022 CAMT/PAIN, schematy niestandardowe XSD).
SWIFT MT940/942 (pola pozycyjne).
JSON-API/NDJSON (przyrostowe przesyłki, kursory).
PDF (tabelaryczne - parser; skany - OCR).
ZIP/TAR. GZ (partie wielu plików).
2) Architektura rurociągu ingestion
Kontury:1. Lądowanie: bezpieczne odbiór plików (SFTP/FTPS/Webل/API/webhooks) → natychmiast rozważyć checksum, przechowywać surowce niezmiennie.
2. Raw: układ według dat/dostawców/masła, przechowywanie z wersjami.
3. Normalizacja: parsing → ujednolicenie typów/jednostek → znormalizowane tabele.
4. Zatwierdzone: po walidacji (zasady jakości) → flagi, DLQ.
5. Dopasowane: mapowanie do wewnętrznych zdarzeń/banku.
6. Obsługa/BI: wyświetlanie przypadków pojednania/finansów/transakcji.
Kluczowe wymagania:- Idempotencja spożywania: „(dostawca, file_name, file_size, checksum, statement_date)” → unikalny klucz.
- Reruns/Retrays: przekierowanie pliku nie tworzy duplikatów.
- DLQ (kolejka martwych liter): wszystkie nierozpoznane/naruszające zasady - do odizolowanej kolejki.
- Wersioning: nowy plik na ten sam dzień → nowa wersja z linkiem do poprzedniego.
3) Bezpieczeństwo dostawy i tajemnice
Kanały: SFTP z ograniczonymi klawiszami; FTPS - tylko przy ścisłym TLS; API - OAuth2/short żetony TTL.
Szyfrowanie treści: PGP/GPG podczas pobierania plików; S/MIME dla skrzynek pocztowych (jeśli są używane).
Kontrola integralności: SHA-256/512 checksum, porównanie z hashem w manifest.
Sekrety: przechowywanie w skarbcu/KMS, rotacja, zabronione w plikach/dziennikach konfiguracyjnych.
Dostęp: RBAC + zasada „najmniejszych przywilejów”, odrębne konta serwisowe.
4) Normalizacja i system danych
4. 1 Zasady uniwersalne
Czas: zawsze UTC w ISO-8601; w przypadku dat rozliczeniowych - „DATE” bez TZ.
Kwoty: „DECIMAL (p, s)” w małych jednostkach + indywidualnej „skali”; znak: potwierdzenie/koszt ściśle według słownika.
Waluty: ISO-4217, tabela kursów stałych z 'fx _ src'.
Locali: zakaz autodetekcji - wyraźne ustawienie separatorów/punkt dziesiętny/tysiące.
Kodowania: wejście UTF-8; inne - konwersja za pomocą dziennika.
4. 2 Znormalizowana warstwa „płaska” (przykład)
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) Parsery według formatu: Sztuczki i Rake
5. 1 CSV/TSV
Wyraźnie określić 'delimiter', 'quotechar', 'escapechar', 'encoding'.
5. 2 XLSX
Odczyt blachą białą; Auto Merge Inhibit - Flattens połączone komórki.
konwersja wzorów na wartości; Excel → daty UTC z wyraźnym TZ.
5. 3 XML (ISO 20022 CAMT/PAIN)
Walidacja przez XSD; XPath mapowanie tożsamości ('<Ntry>', '<TxDtls>', '<Amt>', '<CdtDbtInd>').
Normalizacja kredytowa/debetowa → znak; obsługa wielu '<Chrgs>', '<RmtInf>'.
5. 4 MT940
Znaczniki parsowania ': 61:', ': 86:'; wsparcie dla rozszerzeń krajowych; pola pozycyjne → zasady krojenia.
Konsolidacja kilku ': 61:' w jedną partię.
5. 5 JSON/NDJSON/API
5. 6 PDF/OCR
Najpierw próba parsowania stołu (detektor tabeli), tylko wtedy OCR (Tesseract) z białymi znakami.
Po walidacji: kwoty, sumy kontrolne, uzgodnienie liczby linii.
5. 7 Archiwum/partie
Rozpakowanie z zachowaniem konstrukcji; każdy plik - oddzielny 'file _ id'; manifest, kontrola wszystkich części.
6) Walidacja jakości danych i zasady
Obowiązkowe kontrole:- Schemat - wszystkie wymagane pola są obecne.
- Rodzaje: kwoty - liczbowe, daty - parse.
- Checksums/Total - Suma wierszy = Razem w pliku (jeśli istnieje).
- Zakresy: data w rozsądnym oknie; suma> 0 (lub według słownika dozwolonego negatywu).
- Wyjątkowość: '(dostawca, provider_txid, sekwencja)' nie jest powielana w normalizacji.
- Dopuszczalne są rozbieżności „ilość/fx/czas”.
Wynik: 'VALID', 'VALID _ WITH _ WARNINGS', 'INVALID → DLQ (reason_code)'.
7) Tożsamość i deduplikowanie
Klucz ingestion: '(dostawca, file_name, plik, checksum, statement_date)' → pojedynczy 'file _ id'.
idem rzędu: 'row _ hash = sha256 (normalized_row_compact)'; przeładunek nie tworzy nowych rekordów.
Webhooks/API: dostawca 'idempotency _ key' + tagi ('exec _ id'), przechowuj TTL.
Duplikaty dostawcy: dedup przez 'provider _ txid' + 'sequence', w przypadku rozbieżności - w DLQ_DUPLICATE.
8) Orkiestra i harmonogramy
Оркестратов: Airflow/Dagster (DAG: 'fetch → decrypt → parse → normalize → validate → publish → match').
SLA/SLO: „Czas do dostępności (TtA)” od wystąpienia pliku do „znormalizowanego = READY”.
Retrai: wykładniczy backoff + jitter; ograniczenia prób; jasne statusy.
Równoczesność i izolacja: ciężki OCR/parsing XLSX - w osobnym basenie/pracowniku z limitem CPU/RAM.
DLQ-replay: okresowa przeróbka podczas aktualizacji reguł/map.
9) Obserwowalność i wpisy
Metryka:- Spożycie Sukces%, Sukces Parse% według źródła.
- TtA p50/p95, przepustowość (linie/min).
- DLQ Wskaźnik dla Aging DLQ p50/p95.
- Schemat Drift Incydenty.
- Duplicate Stawka - 'provider _ txid'.
- „TtA p95> SLA” → P1.
- 'DLQ Rate> 2%' na godzinę dla → dostawcy P1.
- 'Schemat Drift wykryty' → P0 (stop auto-matching by source).
- 'Duplikat spike' → P2 (dostawca czeków/haki internetowe).
Dashbord: a lejek 'pliki → rows_raw → rows_norm → rows_valid → rows_matched', karta DLQ z powodów, TtA-kwantyle.
10) Automatyczne korekty i odwzorowania
Pseudonimy nagłówka: słownik z wersjami (np. „Kwota” → „amt',” KWOTA „→” amt').
11) Link do „Uzgodnienie płatności i sprawozdań PSP”
Gotowa warstwa znormalizowana - wejście do dopasowywania (provider_txid/merchant_ref/fuzzy), obliczanie diff-taksonomii, auto-logów i rozrachunku Pola kluczowe: 'provider _ txid', 'sequence', 'kind', 'amount _ minor', 'value _ date', 'account'.
12) Model i tabele składowania
Tabela plików wyładowanych: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
);
Znormalizowane rzędy:
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) Pseudokod parserowy
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) RODO/PII i edycja dziennika
Maskowanie/hashing: PAN/email/phone → 'sha256 + salt', logi - bez podstawowych wartości.
Zasady przechowywania: „zatrzymanie” według rodzaju źródła (AML/rachunkowość).
Dostęp do PII - wyłącznie przez rolę; audyt odczytu/wywozu.
15) KPI i cele (do parsowania/spożywania)
Spożycie Sukces% ≥ 99. 5 %/dzień na źródło.
Sukces Parse% ≥ 99%, DLQ ≤ 1%.
TtA p95 (fayl → znormalizowany) ≤ 15 minut (CSV/XML), ≤ 60 minut (PDF/OCR).
Schemat Drift Incydenty: 0/miesiąc bez alarmu/naprawy.
Duplicate Stawka - 'provider _ txid' ≤ 0. 05%.
16) Playbooks incydentu
Schemat dryfu: zatrzymać automatyczne dopasowywanie, włączyć „miękki” parser z wykrywaniem ML głośników, przygotować plaster aliasu, uruchomić DLQ-replay.
Przepięcie DLQ: debugowanie najnowszych plików, sprawdzanie kodowania/locale/sign, tymczasowe obniżanie stopnia tolerancji (z flagą).
Opóźnienia SFTP: przełączanie się na ankiety API/haki webowe, zwiększanie retras, komunikacja z dostawcą.
Spikes duplikaty: włącz dodatkową weryfikację 'row _ hash', blok powtórzeń do czasu wyjaśnienia.
17) Pakiet Case Test (UAT/Prod-Ready)
1. Idempotencja: Powtórz to samo obciążenie → 1 'file _ id', 0 nowych linii.
2. Locales: pliki z ', '/'. '/spacje → poprawne sumy.
3. Częściowy/zwrot: wiele 'sekwencji' do jednego 'provider _ txid'.
4. XML XSD: nieprawidłowy CAMT → 'INVALID' + DLQ.
5. MT940 warianty: rozszerzenie krajowe → poprawna analiza.
6. PDF → OCR: skanowanie hałasem → wydobywanie i przekazywanie podstawowych zasad.
7. Schemat drift: nowy nagłówek → alias patch i ponowne przetwarzanie plików historycznych.
8. Przepustowość: test obciążenia plików N/godzina → zgodność z TtA SLA.
9. Wydanie PII: dzienniki bez PAN/e-mail, tylko hashes.
18) Lista kontrolna wdrażania
- Rejestr źródłowy: Protokół, Harmonogram, SLA, Format, Kontakt.
- Bezpieczne kanały (SFTP/PGP/API), Skarbiec dla tajemnic.
- Idempotent ingestion + checksum + wersje.
- Parsery według formatu, słownik aliasu, polityka migowa/lokalna.
- Znormalizowana warstwa i kluczowe wskaźniki.
- Zasady walidacji, tolerancje, DLQ i powtórka.
- Orchestrator (DAG), Retrai/Backoff, Resource Pools.
- Obserwowalność: mierniki, deski rozdzielcze, wpisy.
- Maskowanie RODO/PII, audyty dostępu.
- Przypadki testowe i regularne wiertarki dryfujące.
Wznów streszczenie
Automatyzacja parsingu nie polega na „napisaniu parsera”, ale na budowie obwodu przemysłowego: niezawodnej dostawy i szyfrowania, rurociągów idempotentnych, ścisłej normalizacji, zasad jakości i przejrzystych wpisów. Taki zarys przekształca wszelkie rejestry w przewidywalne tabele z gwarantowanym SLA na temat dostępności danych - podstawą pojednania, skarbu państwa i sprawozdawczości zarządczej.