sestra
This commit is contained in:
@@ -1,111 +1,73 @@
|
|||||||
import mysql.connector
|
import mysql.connector
|
||||||
import re
|
import os
|
||||||
|
|
||||||
# --- KONFIGURACE PŘIPOJENÍ ---
|
|
||||||
db_config = {
|
db_config = {
|
||||||
'host': '127.0.0.1',
|
'host': '127.0.0.1',
|
||||||
'port': 3307,
|
'port': 3307,
|
||||||
'user': 'root',
|
'user': 'root',
|
||||||
'password': 'Vlado9674+',
|
'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:
|
try:
|
||||||
conn = mysql.connector.connect(**db_config)
|
conn = mysql.connector.connect(**db_config)
|
||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
print(f"Připojeno k databázi '{db_config['database']}' na portu {db_config['port']}.")
|
|
||||||
|
|
||||||
current_davka_id = None
|
for root, dirs, files in os.walk(ROOT_DIR):
|
||||||
current_doklad_id = None
|
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:
|
with open(filepath, 'r', encoding='cp1250') as f:
|
||||||
for line in f:
|
first_line = f.readline().strip('\n')
|
||||||
line = line.strip('\n') # Neodstraňujeme mezery na začátku, jsou důležité pro pozice
|
|
||||||
if not line.strip():
|
|
||||||
continue
|
|
||||||
|
|
||||||
# --- HLAVIČKA DÁVKY (DP) ---
|
if not first_line.startswith('DP'): continue
|
||||||
if line.startswith('DP'):
|
|
||||||
identifikator = line[0:20].strip()
|
|
||||||
obdobi = line[20:26].strip()
|
|
||||||
|
|
||||||
cursor.execute(
|
# Unikátní klíč (prvních 30 znaků)
|
||||||
"INSERT INTO davky (identifikator, obdobi) VALUES (%s, %s)",
|
fingerprint = first_line[:30].strip()
|
||||||
(identifikator, obdobi)
|
|
||||||
)
|
|
||||||
current_davka_id = cursor.lastrowid
|
|
||||||
print(f"Importuji dávku: {identifikator} ({obdobi})")
|
|
||||||
|
|
||||||
# --- ZÁZNAM PACIENTA / DOKLAD (A) ---
|
# Kontrola duplicity
|
||||||
elif line.startswith('A'):
|
cursor.execute("SELECT id_davky FROM davky WHERE identifikator = %s", (fingerprint,))
|
||||||
# Příklad: A 206900 1111109305001 0017607272310I800
|
if cursor.fetchone():
|
||||||
cislo_dokladu = line[4:10].strip()
|
continue
|
||||||
|
|
||||||
# Extrakce rodného čísla pomocí regulárního výrazu (hledáme 9-11 číslic v řadě)
|
print(f"Importuji: {filename} -> {fingerprint}")
|
||||||
rc_match = re.search(r'\d{9,11}', line)
|
|
||||||
rodne_cislo = rc_match.group(0) if rc_match else "Nenalezeno"
|
|
||||||
|
|
||||||
# Diagnóza - obvykle 3-4 znaky za rodným číslem
|
# Vložení dávky
|
||||||
diag_part = line[45:50].strip()
|
obdobi = first_line[20:26].strip()
|
||||||
|
cursor.execute("INSERT INTO davky (identifikator, obdobi) VALUES (%s, %s)", (fingerprint, obdobi))
|
||||||
|
id_davky = cursor.lastrowid
|
||||||
|
|
||||||
cursor.execute(
|
# Import všech řádků souboru
|
||||||
"INSERT INTO doklady (id_davky, cislo_poradove, rodne_cislo, diagnoza) VALUES (%s, %s, %s, %s)",
|
with open(filepath, 'r', encoding='cp1250') as f:
|
||||||
(current_davka_id, cislo_dokladu, rodne_cislo, diag_part)
|
id_posledni_a = None
|
||||||
)
|
for idx, line in enumerate(f, 1):
|
||||||
current_doklad_id = cursor.lastrowid
|
raw = line.strip('\n')
|
||||||
|
if not raw: continue
|
||||||
|
typ = raw[0]
|
||||||
|
|
||||||
# --- VÝKON (V) ---
|
# Uložení věty
|
||||||
elif line.startswith('V'):
|
cursor.execute(
|
||||||
# Příklad: V14032025010221 Z000 733
|
"INSERT INTO vety (id_davky, typ_vety, obsah_radku, poradi_v_souboru) VALUES (%s, %s, %s, %s)",
|
||||||
datum_raw = line[1:9] # DDMMYYYY
|
(id_davky, typ, raw, idx)
|
||||||
datum_db = f"{datum_raw[4:8]}-{datum_raw[2:4]}-{datum_raw[0:2]}"
|
)
|
||||||
|
current_id_vety = cursor.lastrowid
|
||||||
|
|
||||||
# Kód výkonu (5-7 znaků)
|
# Hierarchie pod 'A'
|
||||||
kod_vykonu = line[9:16].strip()
|
if typ == 'A':
|
||||||
|
id_posledni_a = current_id_vety
|
||||||
|
|
||||||
# Body (bereme poslední souvislé číslo na řádku)
|
if id_posledni_a:
|
||||||
body_match = re.findall(r'\d+', line[16:])
|
cursor.execute("UPDATE vety SET id_dokladu_vazba = %s WHERE id_vety = %s",
|
||||||
body = int(body_match[-1]) if body_match else 0
|
(id_posledni_a, current_id_vety))
|
||||||
|
conn.commit()
|
||||||
cursor.execute(
|
print("Raw import dokončen.")
|
||||||
"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}")
|
|
||||||
finally:
|
finally:
|
||||||
if 'conn' in locals() and conn.is_connected():
|
conn.close()
|
||||||
cursor.close()
|
|
||||||
conn.close()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
hromadny_raw_import()
|
||||||
import_kvd_data()
|
|
||||||
Reference in New Issue
Block a user