Compare commits

...

8 Commits

Author SHA1 Message Date
275dc1c380 z230 2026-01-18 18:19:49 +01:00
michaela.buzalkova
483c36ddfe sestra 2026-01-08 21:26:17 +01:00
b2e9a0d3c9 z230 2026-01-05 17:20:15 +01:00
ab3f103ec5 ntbvb 2026-01-05 07:32:27 +01:00
20bf839d98 ntbvb 2026-01-05 06:53:06 +01:00
michaela.buzalkova
ffd5e6ff7f sestra 2026-01-05 06:50:14 +01:00
michaela.buzalkova
7f31800b45 Merge remote-tracking branch 'origin/master' 2026-01-05 06:45:27 +01:00
michaela.buzalkova
ee7351bee3 sestra 2026-01-04 20:22:38 +01:00
18 changed files with 339 additions and 2158716 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@ import os
HOSTNAME = platform.node().upper() HOSTNAME = platform.node().upper()
if HOSTNAME in {"SESTRA", "POHODA"}: if HOSTNAME in {"SESTRA", "POHODA","LENOVO"}:
DROPBOX_DRIVE = Path(r"Z:\\") DROPBOX_DRIVE = Path(r"Z:\\")
elif HOSTNAME == "Z230": elif HOSTNAME == "Z230":
DROPBOX_DRIVE = Path(r"U:\\") DROPBOX_DRIVE = Path(r"U:\\")

View File

@@ -4,7 +4,7 @@ from pathlib import Path
# ================= DB CONFIG ================= # ================= DB CONFIG =================
db_config = { db_config = {
'host': '192.168.1.76', 'host': '127.0.0.1',
'port': 3307, 'port': 3307,
'user': 'root', 'user': 'root',
'password': 'Vlado9674+', 'password': 'Vlado9674+',

65
Davky/30 Avety.py Normal file
View File

@@ -0,0 +1,65 @@
import mysql.connector
def parse_a_vety_bulk():
db_config = {
'host': '192.168.1.76',
'port': 3307,
'user': 'root',
'password': 'Vlado9674+',
'database': 'ordinace'
}
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor(dictionary=True)
# 1. Načtení všech 'A' vět z archivu
print("Načítám věty typu A z databáze...")
cursor.execute("SELECT id_davky, obsah_radku FROM vety WHERE typ_vety = 'A'")
raw_records = cursor.fetchall()
if not raw_records:
print("Nenalezeny žádné věty typu A ke zpracování.")
return
# 2. Příprava seznamu dat pro hromadný insert
data_to_insert = []
for row in raw_records:
s = row['obsah_radku']
# Extrakce polí podle tvé specifikace (pozice + délka)
# Slicing v Pythonu: s[start : start + delka]
tuple_data = (
row['id_davky'], # id_davky
s[13:16].strip(), # HCPO (Pojišťovna)
s[17:25].strip(), # HICO (IČP)
s[31:34].strip(), # HODB (Odbornost)
s[1:8].strip(), # HCID (Číslo dokladu)
s[34:44].strip(), # HROD (Číslo pojištěnce / RČ)
s[44:49].strip() # HZDG (Diagnóza)
)
data_to_insert.append(tuple_data)
# 3. Hromadné vložení (Insert Many)
sql = """
INSERT INTO doklady
(id_davky, pojistovna, icp, odbornost, cislo_poradove, rodne_cislo, diagnoza)
VALUES (%s, %s, %s, %s, %s, %s, %s)
"""
try:
print(f"Vkládám {len(data_to_insert)} záznamů do tabulky doklady...")
cursor.executemany(sql, data_to_insert)
conn.commit()
print("Hromadný import dokladů byl úspěšně dokončen.")
except mysql.connector.Error as err:
print(f"Chyba při hromadném vkládání: {err}")
conn.rollback()
finally:
cursor.close()
conn.close()
if __name__ == "__main__":
parse_a_vety_bulk()

113
Davky/40 Vvety.py Normal file
View File

@@ -0,0 +1,113 @@
import mysql.connector
import sys
# --- KONFIGURACE ---
db_config = {
'host': '192.168.1.76',
'port': 3307,
'user': 'root',
'password': 'Vlado9674+',
'database': 'ordinace'
}
def transform_archive_to_results():
# Vynucený výpis hned na začátku
print(">>> Startuji proces transformace...", flush=True)
try:
print("Navazuji spojení s MySQL serverem (port 3307)...", flush=True)
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor(dictionary=True)
print("Spojení navázáno.", flush=True)
# 1. KROK: VYMAZÁNÍ CÍLOVÝCH TABULEK
print("Mažu stará data z tabulek: vykony, leciva, doklady...", flush=True)
# Mažeme v pořadí od dětí k rodičům kvůli integritě
cursor.execute("DELETE FROM vykony")
cursor.execute("DELETE FROM leciva")
cursor.execute("DELETE FROM doklady")
conn.commit()
print("Tabulky jsou prázdné.", flush=True)
# 2. KROK: PARSOVÁNÍ DOKLADŮ (Věty A)
print("Načítám věty typu A z archivu (vety)...", flush=True)
cursor.execute("SELECT id_vety, id_davky, obsah_radku FROM vety WHERE typ_vety = 'A'")
a_vety_raw = cursor.fetchall()
mapping_veta_to_doklad = {}
insert_a_sql = """
INSERT INTO doklady (id_davky, pojistovna, icp, odbornost, cislo_poradove, rodne_cislo, diagnoza)
VALUES (%s, %s, %s, %s, %s, %s, %s)
"""
for row in a_vety_raw:
s = row['obsah_radku']
# Extrakce dat dle specifikace
vals = (
row['id_davky'],
s[13:16].strip(), # HCPO - Pojišťovna
s[17:25].strip(), # HICO - IČP
s[31:34].strip(), # HODB - Odbornost
s[1:8].strip(), # HCID - Číslo dokladu
s[34:44].strip(), # HROD - Číslo pojištěnce (RČ)
s[44:49].strip() # HZDG - Diagnóza
)
cursor.execute(insert_a_sql, vals)
mapping_veta_to_doklad[row['id_vety']] = cursor.lastrowid
conn.commit()
print(f"Úspěšně zpracováno {len(a_vety_raw)} dokladů.", flush=True)
# 3. KROK: PARSOVÁNÍ VÝKONŮ (Věty V)
print("Provazuji a vkládám výkony (V)...", flush=True)
cursor.execute("SELECT id_dokladu_vazba, obsah_radku FROM vety WHERE typ_vety = 'V'")
v_vety_raw = cursor.fetchall()
v_bulk_data = []
for row in v_vety_raw:
v = row['obsah_radku']
vazba_a = row['id_dokladu_vazba']
if vazba_a in mapping_veta_to_doklad:
d = v[1:9] # VDAT (Datum DDMMYYYY)
datum_sql = f"{d[4:8]}-{d[2:4]}-{d[0:2]}"
# Body VBOD (pozice 23, délka 7)
body_val = v[23:30].strip()
body = int(body_val) if body_val.isdigit() else 0
v_bulk_data.append((
mapping_veta_to_doklad[vazba_a], # id_dokladu (nový PK)
datum_sql, # datum_vykonu
v[9:14].strip(), # VKOD - Kód výkonu
int(v[14:15]) if v[14:15].isdigit() else 1, # VPOC - Počet
v[15:18].strip(), # VODB - Odbornost
v[18:23].strip(), # VDIA - Diagnóza
body # body
))
if v_bulk_data:
insert_v_sql = """
INSERT INTO vykony (id_dokladu, datum_vykonu, kod_vykonu, pocet, odbornost, diagnoza, body)
VALUES (%s, %s, %s, %s, %s, %s, %s)
"""
cursor.executemany(insert_v_sql, v_bulk_data)
conn.commit()
print(f"Hromadně vloženo {len(v_bulk_data)} výkonů.", flush=True)
print("-" * 30, flush=True)
print("Transformace dokončena.", flush=True)
except mysql.connector.Error as err:
print(f"Chyba databáze: {err}", flush=True)
except Exception as e:
print(f"Neočekávaná chyba: {e}", flush=True)
finally:
if 'conn' in locals() and conn.is_connected():
cursor.close()
conn.close()
if __name__ == "__main__":
transform_archive_to_results()

126
ECG/30 ECG test3.py Normal file
View File

@@ -0,0 +1,126 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import fitz
import os
import re
import time
import io
import pytesseract
from pathlib import Path
from PIL import Image
from FunkceWhereIsDropbox import get_dropbox_path
# --- CONFIGURATION ---
#Get cesta to Dropbox on working computer
dropbox=get_dropbox_path()
BASE_DIR=dropbox/"Ordinace"/"Dokumentace_ke_zpracování"/"EKGforProcessing"
FLAG = "rotated-by-script"
# Point to your Tesseract executable if it's not in your PATH:
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
def ocr_page(page):
"""Perform OCR using Tesseract with high DPI for better accuracy."""
# Increasing DPI to 300 is crucial for small text on EKG strips
pix = page.get_pixmap(dpi=300)
img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
# Using 'ces' for Czech language support
# PSM 6: Assume a single uniform block of text
text = pytesseract.image_to_string(img, lang='ces', config='--psm 6')
return text
def extract_rodne_cislo(text):
"""Extracts RC (6 digits + optional slash/spaces + 3-4 digits)."""
m = re.search(r"(\d{6})\s*/?\s*(\d{3,4})", text)
if not m:
return None
left = m.group(1)
right = m.group(2).zfill(4)
return left + right
def extract_date(text):
"""Extracts date with high tolerance for OCR spacing errors."""
# Matches D.M.YYYY, D. M. YYYY, DD.MM.YYYY, etc.
# It also handles if OCR accidentally puts a comma instead of a dot
m = re.search(r"(\d{1,2})[\.,]\s*(\d{1,2})[\.,]\s*(\d{4})", text)
if m:
return m.groups()
return None
def convert_date_to_iso(date_tuple):
"""Converts (D, M, Y) -> YYYY-MM-DD."""
d, m, y = date_tuple
return f"{y}-{m.zfill(2)}-{d.zfill(2)}"
# --- MAIN PROCESS ---
for pdf_path in BASE_DIR.glob("*.pdf"):
if ".tmp" in pdf_path.name: continue
print(f"\n{'=' * 60}")
print(f"PROCESSING: {pdf_path.name}")
print(f"{'=' * 60}")
doc = fitz.open(pdf_path)
meta = doc.metadata
keywords = meta.get("keywords", "") or ""
# 1. HANDLE ROTATION
if FLAG not in keywords:
print(" [Action] Rotating page...")
page = doc[0]
page.set_rotation((page.rotation + 90) % 360)
if doc.page_count > 1:
doc.delete_page(1)
meta["keywords"] = (keywords + " " + FLAG).strip()
doc.set_metadata(meta)
tmp = pdf_path.with_suffix(".tmp.pdf")
doc.save(tmp, deflate=True)
doc.close()
os.replace(tmp, pdf_path)
doc = fitz.open(pdf_path)
# 2. PERFORM OCR
raw_text = ocr_page(doc[0])
# --- DEBUG PRINTOUT ---
print("\n--- START OF EXTRACTED TEXT ---")
print(raw_text)
print("--- END OF EXTRACTED TEXT ---\n")
# ---------------------
rc = extract_rodne_cislo(raw_text)
date_tuple = extract_date(raw_text)
print(f"RESULT -> RC: {rc if rc else 'NOT FOUND'}")
print(f"RESULT -> Date: {date_tuple if date_tuple else 'NOT FOUND'}")
doc.close()
# 3. RENAME LOGIC
if rc and date_tuple:
date_iso = convert_date_to_iso(date_tuple)
new_name = f"{rc} {date_iso} [EKG] [bez hodnocení].pdf"
new_path = pdf_path.with_name(new_name)
if not new_path.exists():
try:
# Close the handle properly before renaming
pdf_path.rename(new_path)
print(f"✅ Success: Renamed to {new_name}")
except Exception as e:
print(f"❌ Rename error: {e}")
else:
print(f"⚠ Skipping: {new_name} already exists.")
else:
print("❌ Script could not find all data. Check the extracted text above.")
print("\nAll files processed.")

33
PDF/VložstranydoPDF.py Normal file
View File

@@ -0,0 +1,33 @@
import pypdf
# Název nahraného souboru a název výsledku
input_pdf = "u:\Dropbox\!!!Days\Downloads Z230\zkouska-matematicke-metody-pro-statistiky (1).pdf"
output_pdf = "u:\Dropbox\!!!Days\Downloads Z230\zkouska_s_poznamkami.pdf"
def uprav_pdf_pro_poznamky(vstup, vystup):
reader = pypdf.PdfReader(vstup)
writer = pypdf.PdfWriter()
# Standardní rozměry A4 v bodech (72 DPI)
A4_WIDTH = 595
A4_HEIGHT = 842
for i, strana in enumerate(reader.pages):
# 1. Přidáme původní stranu ze souboru
writer.add_page(strana)
# 2. Za každou druhou stranu (2, 4, 6...) vložíme 2 prázdné listy
# Index i začíná od 0, proto kontrolujeme (i + 1)
if (i + 1) % 2 == 0:
writer.add_blank_page(width=A4_WIDTH, height=A4_HEIGHT)
writer.add_blank_page(width=A4_WIDTH, height=A4_HEIGHT)
# Uložení nového PDF
with open(vystup, "wb") as f:
writer.write(f)
print(f"Soubor '{vystup}' byl úspěšně vytvořen.")
# Spuštění procesu
uprav_pdf_pro_poznamky(input_pdf, output_pdf)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1 +0,0 @@
/mnt/user/#ColdData/physical_files_list.txt

View File

@@ -1,4 +0,0 @@
TOTO JSOU ZÁZNAMY V DB, KTERÉ NA DISKU NEEXISTUJÍ:
/mnt/user/#ColdData/#40 SP1 SBS2003 ENG SP1/#2 WSS2003SP1-kb841876-fullfile-ENU_2.exe
/mnt/user/#ColdData/#40 SP1 SBS2003 ENG SP1/tcmd852ax32.exe
/mnt/user/#ColdData/#40 SP1 SBS2003 ENG SP1/#2 WSS2003SP1-kb841876-fullfile-ENU.exe

File diff suppressed because it is too large Load Diff

View File

@@ -1,52 +0,0 @@
záleský vojtěch - převzetí (2025)/01 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/02 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/03 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/04 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/05 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/06 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/07 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/08 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/09 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/10 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/11 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/12 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/13 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/14 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/15 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/16 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/17 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/18 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/19 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/20 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/21 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/22 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/23 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/24 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/25 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/26 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/27 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/28 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/29 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/30 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/31 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/32 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/33 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/34 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/35 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/36 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/37 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/38 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/39 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/40 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/41 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/42 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/43 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/44 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/45 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/46 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/47 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/48 - [vojtěch záleský] - převzetí.mp3
záleský vojtěch - převzetí (2025)/audiokniha-prevzeti-vojtech-zalesky-original.jpg
záleský vojtěch - převzetí (2025)/audiokniha-prevzeti-vojtech-zalesky.jpg
záleský vojtěch - převzetí (2025)/folder.jpg
záleský vojtěch - převzetí (2025)/info.txt

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff