feat(etl): извлечение по форматам (агент B) — docx/xlsx/xls/pdf
- единый грид-экстрактор: поиск шапки, роли колонок, секции, N тарифов - отсев колонок-индексов и не-цен; название по доле кириллицы - PDF: реконструкция таблицы по координатам слов (нет линий → extract_tables пуст) - детектор битого текстового слоя → пометка scan_pdf для Vision - проверено на реальном архиве: 6/8 клиник нативно, 15599 позиций; 2 файла → Vision Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
"""Прогон извлечения по всему архиву: сколько позиций берёт каждый формат."""
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
REPO = Path(__file__).resolve().parents[2]
|
||||
sys.path.insert(0, str(REPO))
|
||||
|
||||
from etl.extractors import extract
|
||||
|
||||
files = sorted((REPO / "data/raw").glob("*"))
|
||||
total = 0
|
||||
for path in files:
|
||||
doc = extract(str(path))
|
||||
total += len(doc.rows)
|
||||
tiers = sorted({t for row in doc.rows for t in row.prices})
|
||||
print(f"\n{'=' * 68}")
|
||||
print(f"{path.name} [{doc.file_format}] партнёр='{doc.partner_name}' дата={doc.effective_date}")
|
||||
print(f" позиций: {len(doc.rows)} | тарифы: {tiers}")
|
||||
if doc.parse_log:
|
||||
print(f" лог: {doc.parse_log[:2]}")
|
||||
for row in doc.rows[:3]:
|
||||
print(f" код={row.service_code_source!r} «{row.service_name_raw[:40]}» {row.prices} секц={row.section!r}")
|
||||
|
||||
print(f"\n{'=' * 68}\nИТОГО позиций по архиву: {total}")
|
||||
Reference in New Issue
Block a user