Тізілімдерді парсингтеу және автоматтандыру
TL; DR
Сенімді «салыстырып тексеру» автоматикасы үш китке құрылады: детерминирленген ingestion (қауіпсіз жеткізу, идемпотенттілік, тұтастығын бақылау), қалыпқа келтірілген деректер қабаты (бірыңғай схема, салыстыру кілттері, стандартталған уақыт/валюта/белгілер бірліктері) және қатаң сапа тәртібі (валидациялар, толеранстар, DLQ, алерттар, автоматты түрде түзету). Мақсаты - қол жетімділігі бойынша SLA-мен салыстыру, есептілік және BI үшін әртүрлі файлдарды/веб-хаттарды тұрақты кестелерге айналдыру.
1) Көздер мен форматтардың ландшафты
1. 1 Дереккөздер
PSP/эквайерлер/агрегаторлар: транзакциялар, жиынтықтар, комиссиялар, пікірталастар.
Банктер: MT940, ISO 20022 CAMT көшірмелері. 052/053/054, PAIN төлемдері. 001/002.
АЖО/әмияндар/төлемдер (OCT/RTP/SEPA): payouts тізілімдері, қайтарымдар.
Крипто-кастоди/биржалар: он-чейн транзакциялары, айырбастау/комиссия есептері.
Салықтар/мемлекеттік. порталдар: CSV/XLSX/PDF, кейде бейнеленген браузер арқылы.
1. 2 пішімдері
CSV/TSV (вариативті бөлгіштер, локальдар, кодтаулар).
XLSX (көп шит, біріктірілген ұяшықтар).
XML (ISO 20022 CAMT/PAIN, XSD теңшелетін схемалар).
SWIFT MT940/942 (позициялық өрістер).
JSON-API/NDJSON (инкрементальды түсіру, курсорлар).
PDF (кестелік - парсер; сканерлер - OCR).
ZIP/TAR. GZ (бірнеше файлды батшы).
2) ingestion-пайплайн архитектурасы
Сұлбалар:1. Landing: файлдарды қауіпсіз қабылдау (SFTP/FTPS/WebDAV/API/webhooks) → дереу checksum санаймыз, шикізатты өзгеріссіз сақтаймыз.
2. Raw: күндер/провайдерлер/батштар бойынша орналастыру, нұсқаларымен сақтау.
3. Normalize: парсинг → түрлерін/бірліктерін біріздендіру → normalized кестелер.
4. Validated: пост-валидация (сапа ережелері) → жалаулар, DLQ.
5. Matched: ішкі оқиғалармен/банкпен салыстыру.
6. Serving/BI: салыстыру/қаржы/операциялар үшін сөрелер.
Негізгі талаптар:- ingestion ұқсастығы: '(provider, file_name, file_size, checksum, statement_date)' → бірегей кілт.
- Қайталаулар/ретрайлер: файлды қайталап айдау қайталанбайды.
- DLQ (dead-letter queue): барлық танылмаған/ережелерді бұзған - оқшауланған кезекке.
- Нұсқалау: бір күнде жаңа файл → алдыңғысына сілтеме жасайтын жаңа нұсқа.
3) Жеткізу және құпия қауіпсіздігі
Арналар: SFTP кілттері шектеулі; FTPS - тек қатаң TLS кезінде; API - OAuth2/қысқа TTL бар токендер.
Мазмұнды шифрлау: Файлдарды қотару кезінде PGP/GPG; e-mail-инбокстар үшін S/MIME (егер пайдаланылса).
Тұтастықты бақылау: SHA-256/512 checksum, манифесттегі хешпен салыстыру.
Құпиялар: Vault/KMS, ротация файлдарында/файлдарында сақтауға тыйым салынған.
Қолжетімділіктер: RBAC + «ең аз артықшылықтар» қағидаты, жеке сервис-аккаунттар.
4) Деректерді қалыпқа келтіру және схемасы
4. 1 Әмбебап ережелер
Уақыт: әрқашан ISO-8601 UTC; settlement даталары үшін - 'DATE' TZ жоқ.
Сома: 'DECIMAL (p, s)' в minor units + жеке 'scale'; белгі: кіріс/шығыс қатаң түрде сөздік бойынша.
Валюталар: ISO-4217, с 'fx _ src' бағамдарының тіркелген кестесі.
Локальдар: Автотектерге тыйым салу - бөлгіштерді/ондық нүктені/мыңдық нүктені нақты теңшеу.
Кодталуы: 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
sheet whitelist бойынша оқу; автоқосылыстарға тыйым салу - біріктірілген ұяшықтарды жазу.
Формулаларды мәндерге түрлендіру; күндер Excel → UTC анық TZ.
5. 3 XML (ISO 20022 CAMT/PAIN)
XSD бойынша валидация; Деректемелердің XPath-маппингі ('<Ntry>', '<TxDtls>', '<Amt>', '<CdtDbtInd>').
credit/debit → белгісін қалыпқа келтіру; '<Chrgs>', '<RmtInf>'.
5. 4 MT940
Тегтерді талдау ': 61:', ': 86:'; ұлттық кеңейтулерді қолдау; позиция өрістері → slicing ережелері.
Бірнешеуінің шоғырлануы: 61: 'бір батч.
5. 5 JSON/NDJSON/API
5. 6 PDF/OCR
Алдымен кестелік парсинг әрекеті (таб-детектор), содан кейін ғана whitelist таңбалармен OCR (Tesseract).
Пост-валидация: сомалар, бақылау қорытындылары, жолдар санын салыстыру.
5. 7 Мұрағаттар/батчилер
Құрылымды сақтай отырып қаптаманы ашу; әрбір файлға - жеке 'file _ id'; манифест, барлық бөліктерді бақылау.
6) Валидация және деректер сапасының ережелері
Міндетті тексерулер:- Сызба: барлық required өрістері бар.
- Түрлері: сомалар - сандық, күндер - парсильденеді.
- Бақылау сомалары/қорытындылары: жолдардың сомасы = файлдағы жиынтық (егер бар болса).
- Ауқымдар: ақылға қонымды терезедегі күн; сомасы> 0 (немесе жарамды теріс сөздік бойынша).
- Бірегейлік: '(provider, provider_txid, sequence)' normalized қайталанбайды.
- Толеранттар: 'amount/fx/time' рұқсат етілген айырмашылықтар.
Нәтижесі: 'VALID', 'VALID _ WITH _ WARNINGS', 'INVALID → DLQ (reason_code)'.
7) Идемпотенттілік және дедупликация
Ingestion key: '(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: 'Time-to-Availability (TtA)' файлдың пайда болуынан бастап 'normalized = READY' дейін.
Ретраялар: экспоненциалды backoff + jitter; әрекеттер лимиттері; нақты мәртебелер.
Параллелизм және оқшаулау: ауыр OCR/парсинг XLSX - CPU/RAM лимиті бар жеке пулда/воркерде.
DLQ-replay: ережелерді/маппингтерді жаңарту кезінде мерзімді reprocess.
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 (провайдерді/вебхоктарды тексеру).
Дашборд: воронка 'files → rows_raw → rows_norm → rows_valid → rows_matched', DLQ картасы себептермен, TtA-квантили.
10) Автоматты түзету және маппингтер
Header aliases: нұсқалары бар сөздік (e. g., `Amount`→`amt`, `AMOUNT`→`amt`).
11) «PSP төлемдері мен есептерін салыстыру» байланысы
Дайын normalized қабат - матчинг (provider_txid/merchant_ref/fuzzy), diff-таксономияны есептеу, авто-журналдар және settlement, bank-тігістер үшін кіру. Негізгі өрістер: 'provider _ txid', 'sequence', 'kind', 'amount _ minor', 'value _ date', 'account'.
12) Сақтау орны мен кестенің үлгісі
Landed файлдар кестесі: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/email/телефон → 'sha256 + salt', логи - бастапқы мәндерсіз.
Сақтау саясаты: көз түрі бойынша 'retention' (AML/бухгалтерлік есеп).
PII қолжетімділік - тек рөлі бойынша; оқу/экспорт аудиті.
15) KPI және мақсаттар (парсинг/ingestion үшін)
Ingestion Success % ≥ 99. көзіне 5 %/күн.
Parse Success % ≥ 99%, DLQ ≤ 1%.
TtA p95 (файл → normalized) ≤ 15 минут (CSV/XML), ≤ 60 минут (PDF/OCR).
Schema Drift Incidents: 0/ай алертсіз/фикссіз.
Duplicate Rate по `provider_txid` ≤ 0. 05%.
16) Инциденттердің плейбуктері
Schema drift: авто-матчингті тоқтату, ML-детекторы бар «жұмсақ» парсерді қосу, alias-патч дайындау, DLQ-replay-ді қуып шығу.
DLQ жүгірісі: соңғы файлдарды ретке келтіру, кодтауды/локальді/таңбаны тексеру, толеранстардың қатаңдығын уақытша төмендету (жалаушамен).
SFTP кідірістері: API-polling/вебхукке ауысу, ретрацияны ұлғайту, провайдермен байланыс.
Spikes duplicates: 'row _ hash' қосымша тексерісін, қайталау блогын анықтағанға дейін қосу.
17) Тест-кейс-пакет (UAT/Prod-дайындық)
1. Сәйкестік: сол жүктеуді қайталау → 1 'file _ id', 0 жаңа жол.
2. Локальдар: ', '/'. '/бос орындар → дұрыс сома файлдары.
3. Partial/refund: бірнеше 'sequence' бір 'provider _ txid'.
4. XML XSD: Name CAMT → 'INVALID' + DLQ.
5. Вариация MT940: ұлттық кеңейту → дұрыс талдау.
6. PDF → OCR: шулы сканерлеу → негізгі ережелерді алу және өту.
7. Schema drift: жаңа хэдер → alias-патч және тарихи файлдарды қайта өңдеу.
8. Throughput: жүктеме тест N файл/сағат → TtA SLA сақтау.
9. PII-редакция: PAN/e-mail жоқ логтар, тек хэштер.
18) Енгізу чек-парағы
- Дереккөздер тізілімі: хаттама, кесте, SLA, пішім, контакт.
- Қауіпсіз арналар (SFTP/PGP/API), Құпиялар үшін Vault.
- Idempotent ingestion + checksum + нұсқалары.
- Пішімдер бойынша парсерлер, alias-сөздік, sign/locale-саясат.
- Қалыпқа келтірілген қабат және кілт индекстері.
- Валидация, толеранс, DLQ және replay ережелері.
- Оркестратор (DAG), ретра/backoff, ресурстар пулы.
- Бақылануы: метрика, дашборд, алерта.
- GDPR/PII-бүркемелеу, қол жеткізу аудиті.
- Тест-кейстер және тұрақты schema-drift drills.
Түйіндеме
Парсингті автоматтандыру - бұл «парсерді жазу» емес, өнеркәсіптік контурды құру: сенімді жеткізу және шифрлау, демпотенттік пайплайндар, қатаң қалыпқа келтіру, сапа ережелері және мөлдір алерттар. Мұндай контур кез келген тізілімдерді деректердің қолжетімділігі бойынша SLA кепілдендірілген болжамды кестелерге айналдырады - салыстыру, қазынашылық және басқару есептілігінің іргетасы.