import json,re from pathlib import Path from collections import Counter base=Path(r"C:\Apache24\htdocs\.codex_tmp") rows=json.loads((base/'ocr_merged.json').read_text(encoding='utf-8')) trans=str.maketrans('٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹','01234567890123456789') rot={} for angle in (90,180,270): data=json.loads((base/f'ocr_rot{angle}_results.json').read_text(encoding='utf-8-sig')) for r in data: sid=int(r['file'].split('_')[1]); text=(r.get('text') or '').translate(trans) cs=[] for idx,line in enumerate(text.split('|')): digits=re.sub(r'\D','',line) if 6<=len(digits)<=9 and idx<=2: cs.append(digits) rot.setdefault(sid,[]).extend(cs[:1]) for r in rows: if r['chosen']: continue vals=rot.get(r['id'],[]) counts=Counter(vals) if vals and (len(counts)==1 or counts.most_common(1)[0][1]>=2): r['chosen']=counts.most_common(1)[0][0] r['source']='rotation-consensus' r['rotation_candidates']=vals (base/'ocr_final_candidates.json').write_text(json.dumps(rows,ensure_ascii=False,indent=2),encoding='utf-8') print(json.dumps({'resolved':sum(bool(r['chosen']) for r in rows),'unresolved':sum(not r['chosen'] for r in rows),'rotation_conflicts':sum(not r['chosen'] and len(set(r.get('rotation_candidates',[])))>1 for r in rows)},ensure_ascii=False))