From 74619db6bbbfefc5f14388212193ae9671bd170b Mon Sep 17 00:00:00 2001 From: "michaela.buzalkova" Date: Sun, 4 Jan 2026 18:59:20 +0100 Subject: [PATCH] sestra --- Davky/10 Import textovy davek.py | 128 +++++++++++-------------------- 1 file changed, 45 insertions(+), 83 deletions(-) diff --git a/Davky/10 Import textovy davek.py b/Davky/10 Import textovy davek.py index ca46e73..f3caf46 100644 --- a/Davky/10 Import textovy davek.py +++ b/Davky/10 Import textovy davek.py @@ -1,111 +1,73 @@ import mysql.connector -import re +import os -# --- KONFIGURACE PŘIPOJENÍ --- db_config = { 'host': '127.0.0.1', 'port': 3307, 'user': 'root', 'password': 'Vlado9674+', - 'database': 'ordinace' # Název vaší databáze + 'database': 'ordinace' } -FILE_PATH = r'm:\Medicus\DavkyExport\09305000\111\2025\11\42\KDAVKA.111' # Název souboru s daty +ROOT_DIR = r'm:\Medicus\DavkyExport\09305000' -def import_kvd_data(): +def hromadny_raw_import(): try: conn = mysql.connector.connect(**db_config) cursor = conn.cursor() - print(f"Připojeno k databázi '{db_config['database']}' na portu {db_config['port']}.") - current_davka_id = None - current_doklad_id = None + for root, dirs, files in os.walk(ROOT_DIR): + for filename in files: + if filename.upper().startswith('KDAVKA'): + filepath = os.path.join(root, filename) - with open(FILE_PATH, 'r', encoding='utf-8') as f: - for line in f: - line = line.strip('\n') # Neodstraňujeme mezery na začátku, jsou důležité pro pozice - if not line.strip(): - continue + with open(filepath, 'r', encoding='cp1250') as f: + first_line = f.readline().strip('\n') - # --- HLAVIČKA DÁVKY (DP) --- - if line.startswith('DP'): - identifikator = line[0:20].strip() - obdobi = line[20:26].strip() + if not first_line.startswith('DP'): continue - cursor.execute( - "INSERT INTO davky (identifikator, obdobi) VALUES (%s, %s)", - (identifikator, obdobi) - ) - current_davka_id = cursor.lastrowid - print(f"Importuji dávku: {identifikator} ({obdobi})") + # Unikátní klíč (prvních 30 znaků) + fingerprint = first_line[:30].strip() - # --- ZÁZNAM PACIENTA / DOKLAD (A) --- - elif line.startswith('A'): - # Příklad: A 206900 1111109305001 0017607272310I800 - cislo_dokladu = line[4:10].strip() + # Kontrola duplicity + cursor.execute("SELECT id_davky FROM davky WHERE identifikator = %s", (fingerprint,)) + if cursor.fetchone(): + continue - # Extrakce rodného čísla pomocí regulárního výrazu (hledáme 9-11 číslic v řadě) - rc_match = re.search(r'\d{9,11}', line) - rodne_cislo = rc_match.group(0) if rc_match else "Nenalezeno" + print(f"Importuji: {filename} -> {fingerprint}") - # Diagnóza - obvykle 3-4 znaky za rodným číslem - diag_part = line[45:50].strip() + # Vložení dávky + obdobi = first_line[20:26].strip() + cursor.execute("INSERT INTO davky (identifikator, obdobi) VALUES (%s, %s)", (fingerprint, obdobi)) + id_davky = cursor.lastrowid - cursor.execute( - "INSERT INTO doklady (id_davky, cislo_poradove, rodne_cislo, diagnoza) VALUES (%s, %s, %s, %s)", - (current_davka_id, cislo_dokladu, rodne_cislo, diag_part) - ) - current_doklad_id = cursor.lastrowid + # Import všech řádků souboru + with open(filepath, 'r', encoding='cp1250') as f: + id_posledni_a = None + for idx, line in enumerate(f, 1): + raw = line.strip('\n') + if not raw: continue + typ = raw[0] - # --- VÝKON (V) --- - elif line.startswith('V'): - # Příklad: V14032025010221 Z000 733 - datum_raw = line[1:9] # DDMMYYYY - datum_db = f"{datum_raw[4:8]}-{datum_raw[2:4]}-{datum_raw[0:2]}" + # Uložení věty + cursor.execute( + "INSERT INTO vety (id_davky, typ_vety, obsah_radku, poradi_v_souboru) VALUES (%s, %s, %s, %s)", + (id_davky, typ, raw, idx) + ) + current_id_vety = cursor.lastrowid - # Kód výkonu (5-7 znaků) - kod_vykonu = line[9:16].strip() + # Hierarchie pod 'A' + if typ == 'A': + id_posledni_a = current_id_vety - # Body (bereme poslední souvislé číslo na řádku) - body_match = re.findall(r'\d+', line[16:]) - body = int(body_match[-1]) if body_match else 0 - - cursor.execute( - "INSERT INTO vykony (id_dokladu, datum_vykonu, kod_vykonu, body) VALUES (%s, %s, %s, %s)", - (current_doklad_id, datum_db, kod_vykonu, body) - ) - - # --- LÉČIVA / LÉKY (L) --- - elif line.startswith('L'): - # Příklad: L270220251 0215956 1.000 902.50 - datum_raw = line[1:9] - datum_db = f"{datum_raw[4:8]}-{datum_raw[2:4]}-{datum_raw[0:2]}" - - # Kód léku a cena - parts = line[9:].split() - kod_leku = parts[0] - # Cena je obvykle poslední prvek - cena = float(parts[-1].replace(',', '.')) - - cursor.execute( - "INSERT INTO leciva (id_dokladu, datum_vydani, kod_leciva, cena) VALUES (%s, %s, %s, %s)", - (current_doklad_id, datum_db, kod_leku, cena) - ) - - conn.commit() - print("-" * 30) - print("Import úspěšně dokončen.") - - except mysql.connector.Error as err: - print(f"Chyba databáze: {err}") - except Exception as e: - print(f"Neočekávaná chyba: {e}") + if id_posledni_a: + cursor.execute("UPDATE vety SET id_dokladu_vazba = %s WHERE id_vety = %s", + (id_posledni_a, current_id_vety)) + conn.commit() + print("Raw import dokončen.") finally: - if 'conn' in locals() and conn.is_connected(): - cursor.close() - conn.close() + conn.close() -if __name__ == "__main__": - import_kvd_data() \ No newline at end of file +hromadny_raw_import() \ No newline at end of file