import os from collections import namedtuple hlav = namedtuple("Hlavicka", ["typ", "char", "dtyp", "dico", "dpob", "drok", "dmes", "dcid", "dpoc", "dbody", "dfin", "ddpp", "dvdr1", "dvdr2", "ddtyp"]) av=namedtuple("Aveta",["typ","hcid","hstr","hpoc","hpor","hcpo","htpp","hico","hvar","hodb","hrod","hzdg","hkon","hicz", "hcdz","hrez","hccel","hcbod","dtyp"]) vv=namedtuple("Vveta",["typ","vdat","vkod","vpoc","vodb","vdia","vbod","vtyp"]) zv=namedtuple("Zveta",["typ","hcid","hstr","hpoc","hpor","hico","hvar","hodb","hrod","hzdg","hrez","hccel","htyp"]) lv=namedtuple("Lveta",["typ","ldat","ltpr","lzvl","lkod","lmno","lfin","lvdg","ltyp"]) def lveta(retezec): TYP= retezec[0:1] LDAT= retezec[1:9] LTPR= retezec[9:10] LZVL= retezec[10:11] LKOD= retezec[11:18] LMNO=retezec[18:29] LFIN= retezec[29:39] LVDG= retezec[39:44] VTYP= retezec[44:45] print(TYP, LDAT, LTPR, LZVL,LKOD,LMNO,LFIN,LVDG,VTYP) Lveta = lv(TYP, LDAT, LTPR, LZVL,LKOD,LMNO,LFIN,LVDG,VTYP) print(Lveta) def vveta(retezec): TYP= retezec[0:1] VDAT= retezec[1:9] VKOD= retezec[9:14] VPOC= retezec[14:15] VODB=retezec[15:18] VDIA= retezec[18:23] VBOD= retezec[23:30] VTYP= retezec[30:31] print(TYP, VDAT, VKOD, VPOC,VODB,VDIA,VBOD,VTYP) Vveta = vv(TYP, VDAT, VKOD, VPOC,VODB,VDIA,VBOD,VTYP) print(Vveta) def zveta(retezec): TYP= retezec[0:1] HCID= retezec[1:8] HSTR= retezec[8:9] HPOC= retezec[9:10] HPOR= retezec[10:13] HICO= retezec[13:21] HVAR= retezec[21:27] HODB= retezec[27:30] HROD= retezec[30:40] HZDG= retezec[40:45] HREZ= retezec[45:55] HCCEL= retezec[55:66] DTYP= retezec[66:67] print(TYP, HCID, HSTR, HPOC,HPOR,HICO,HVAR,HODB,HROD,HZDG,HREZ,HCCEL,DTYP ) Zveta = zv(TYP, HCID, HSTR, HPOC,HPOR,HICO,HVAR,HODB,HROD,HZDG,HREZ,HCCEL,DTYP ) print(Zveta) def prvniradek(retezec): TYP = retezec[0:1] # Typ věty „D“ – úvodní věta dávky CHAR = retezec[1:2] # Charakter dávky (viz dále ) – určuje stav předkládaných dokladů v dávce DTYP = retezec[2:4] # typ dávky, číselný kód DICO = retezec[4:12] # IPZ DPOB = retezec[12:16] # kod oblastního pracoviště pojišťovny DROK = retezec[16:20] # rok DMES = retezec[20:22] # měsíc DCID = retezec[22:28] # Číslo dávky – jednoznačné číslo dávky v rámci PZS a roku DPOC = retezec[28:31] # počet dokladů v dávce, slouží k ověření kompletnosti DBODY = retezec[31:42] # nepovinné, počet bodů DFIN = float(retezec[42:60]) # nepovinné, celková částka za doklady DDPP = retezec[60:61] # druh pojistného plnění DVDR1 = retezec[61:74] DVDR2 = retezec[74:87] DDTYP = retezec[87:88] print(TYP, CHAR, DTYP, DICO, DPOB, DROK, DMES, DCID, DPOC, DBODY, DFIN, DDPP, DVDR1,DVDR2,DDTYP) hlavicka=hlav(TYP, CHAR, DTYP, DICO, DPOB, DROK, DMES, DCID, DPOC, DBODY, DFIN, DDPP, DVDR1,DVDR2,DDTYP) print(hlavicka.dvdr1) def aveta(retezec): TYP= retezec[0:1] HCID= retezec[1:8] HSTR= retezec[8:9] HPOC= retezec[9:10] HPOR= retezec[10:13] HCPO= retezec[13:16] HTPP= retezec[16:17] HICO= retezec[17:25] HVAR= retezec[25:31] HODB= retezec[31:34] HROD= retezec[34:44] HZDG= retezec[44:49] HKON= retezec[49:50] HICZ= retezec[50:58] HCDZ= retezec[58:65] HREZ= retezec[65:75] HCCEL= retezec[75:85] HCBOD= retezec[85:92] DTYP= retezec[92:93] print(TYP, HCID, HSTR, HPOC,HPOR,HCPO,HTPP,HICO,HVAR,HODB,HROD,HZDG,HKON,HICZ,HCDZ,HREZ,HCCEL,HCBOD,DTYP ) Aveta = av(TYP, HCID, HSTR, HPOC,HPOR,HCPO,HTPP,HICO,HVAR,HODB,HROD,HZDG,HKON,HICZ,HCDZ,HREZ,HCCEL,HCBOD,DTYP) print(Aveta) konec=0 # with open(r"u:\Dropbox\!!!Days\Downloads Z230\Dávky\DataKDavka (6).111","r",encoding='cp852') as f: # for importradku in f.readlines(): # if importradku[0]=="D": # print(importradku) # prvniradek(importradku) # if importradku[0]=="A": # konec=0 # print(importradku) # aveta(importradku) # if importradku[0] == "V": # print(importradku) # vveta(importradku) # if importradku[0]=="Z": # print(importradku) # zveta(importradku) # if importradku[0] == "L": # konec = 1 # print(importradku) # lveta(importradku) # if konec==2: # exit(0) #010 Projdi vsechny davky root_davky_dir=r"u:\Dropbox\!!!Days\Downloads Z230\Dávky\Data" #010.0 os.walk # for root, folders, files in os.walk(root_davky_dir): # for file in files: # print(file) #010.1 pathlib from pathlib import Path # # all txt files in current dir # for p in Path(".").glob("*.txt"): # print(p) from dataclasses import dataclass from decimal import Decimal, InvalidOperation import re # ---- header spec (0-based) ---- # name, type, length, start, description (optional) HEADER_SPEC = [ ("TYP", "C", 1, 0, "Typ věty (má být 'D')"), ("CHAR", "C", 1, 1, "Charakter dávky (např. 'P')"), ("DTYP", "C", 2, 2, "Typ dávky (např. '98')"), ("DICO", "C", 8, 4, "IČZ PZS"), ("DPOB", "C", 4, 12, "Územní pracoviště"), ("DROK", "N", 4, 16, "Rok uzavření dokladů"), ("DMES", "N", 2, 20, "Měsíc uzavření dokladů"), ("DCID", "N", 6, 22, "Číslo dávky"), ("DPOC", "N", 3, 28, "Počet dokladů"), ("DBODY", "N", 11, 31, "Počet bodů v dávce (volitelné)"), ("DFIN", "$", 18, 42, "Celkem Kč (18.2, volitelné)"), ("DDPP", "C", 1, 60, "Druh pojistného vztahu"), ("DVDR1", "C", 13, 61, "Verze DR 1"), ("DVDR2", "C", 13, 74, "Verze DR 2"), ("DDTYP", "C", 1, 87, "Doplněk typu věty"), ] def _slice0(s: str, start: int, length: int) -> str: """0-based safe slice.""" if s is None: return "" return s[start:start+length] if start < len(s) else "" def _parse_char(s: str): s = (s or "").strip() return s or None def _parse_int(s: str): if s is None: return None digits = re.sub(r"\D", "", s) return int(digits) if digits else None def _parse_money(s: str): """Parse money field '18.2': spaces allowed, comma or dot; returns Decimal or None.""" if s is None: return None s = s.replace("\u00A0", " ").strip().replace(" ", "").replace(",", ".") if not s: return None try: # keep precision with Decimal val = Decimal(s) # optional: round to 2 decimal places return val.quantize(Decimal("0.01")) except (InvalidOperation, ValueError): return None def parse_davka_header_line(line: str, strict=True) -> dict: """ Parse header (first line) of a dávka according to HEADER_SPEC (0-based). Returns dict with typed values. Raises if not a 'DP98' header (strict=True). """ if not line: raise ValueError("Empty header line.") if strict and not line.startswith("DP98"): raise ValueError(f"Invalid header prefix {line[:4]!r}; expected 'DP98'.") out = {"raw": line} # field parsing per spec for name, typ, length, start, *_ in HEADER_SPEC: raw_val = _slice0(line, start, length) if typ == "C": out[name] = _parse_char(raw_val) elif typ == "N": out[name] = _parse_int(raw_val) elif typ == "$": out[name] = _parse_money(raw_val) else: out[name] = raw_val # fallback # basic validations (soft) if strict: if out.get("TYP") != "D": raise ValueError(f"TYP must be 'D', got {out.get('TYP')!r}") if out.get("DTYP") != "98": raise ValueError(f"DTYP must be '98', got {out.get('DTYP')!r}") # Optional month sanity check (accepts '01'..'12' and '00') m = out.get("DMES") if m is not None and m not in range(0, 13): # 0..12 # keep value but you could raise or log here pass return out # recursive exts=("111","201","205","207","209","211") keep={} for soubor in Path(root_davky_dir).rglob("KDAVKA.*"): if not soubor.is_file(): print(f"{soubor} neni platny soubor") continue if soubor.suffix.lstrip(".") not in exts: print(f"{soubor} nema platnou koncovku") continue try: with soubor.open("r",encoding="cp1250",errors="strict",newline="") as f: if f.read(4)=="DP98": #takovy soubor chceme brat v potaz keep[str(soubor)]={"File":soubor} except: continue print(keep) #020 Read headers of davky in keep for soubor in keep: # # def get_kdavka(root_dir, exts=("111","201","205","207","209","211")): # root = Path(root_dir) # wanted = {e.upper() for e in exts} # keep = [] # for p in root.rglob("KDAVKA.*"): # if not p.is_file(): # continue # if p.suffix.lstrip(".").upper() not in wanted: # continue # try: # with p.open("r", encoding="cp1250", errors="strict", newline="") as f: # if f.read(4) == "DP98": # read just 4 chars, cp1250 is single-byte # keep.append(p) # except UnicodeDecodeError: # # bad file — skip # continue # keep.sort() # print(f"{len(keep)} davky (DP98) found under {root}") # return keep