From 554e9bee9955f37b61c5c95cb89961e54c613c91 Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Fri, 10 Jul 2026 13:34:10 +0200 Subject: [PATCH] Format der SivasNummer ohne + --- lib/export_csv.py | 13 +++++++++++-- lib/export_sivas.py | 11 ++++++++++- lib/set_attributs.py | 24 ++++++++++++++++-------- tests/test_omniflo.py | 10 +++++----- 4 files changed, 42 insertions(+), 16 deletions(-) diff --git a/lib/export_csv.py b/lib/export_csv.py index 6271ff1..27aab36 100644 --- a/lib/export_csv.py +++ b/lib/export_csv.py @@ -52,6 +52,15 @@ def build_lookup(boegen, weichen): return lookup +def format_sivasnr(sivasnr): + """ + Wandelt einen "+"-separierten Sivasnr-Wert (Rohformat aus den JSON-Katalogen, + dort weiterhin benoetigt fuer Dateinamen-Referenzen) in eine reine + kommaseparierte Liste fuer die Ausgabe (CSV/Block-Attribut) um. + """ + return ", ".join(p.strip() for p in str(sivasnr).split("+") if p.strip()) + + # --------------------------------------------------------------------------- # Merkmale-Builder # --------------------------------------------------------------------------- @@ -80,7 +89,7 @@ def build_bogen_merkmale(block, eintrag): "Radius": float(eintrag.get("Radius", 0)), "Höhe": get_hoehe(block), "Drehung": get_drehung(block), - "SivasNummer": str(eintrag.get("Sivasnr", "")) + "SivasNummer": format_sivasnr(eintrag.get("Sivasnr", "")) } @@ -93,7 +102,7 @@ def build_weiche_merkmale(block, eintrag): "Höhe": get_hoehe(block), "Drehung": get_drehung(block), "Antrieb Kurve": eintrag.get("SivasnrTEF") is not None, - "SivasNummer": str(eintrag.get("Sivasnr", "")) + "SivasNummer": format_sivasnr(eintrag.get("Sivasnr", "")) } diff --git a/lib/export_sivas.py b/lib/export_sivas.py index 9a45aa3..fac0a01 100644 --- a/lib/export_sivas.py +++ b/lib/export_sivas.py @@ -83,6 +83,15 @@ def get_id(block): return block.get("attribs", {}).get("ID", "") +def format_sivasnr(sivasnr): + """ + Wandelt einen "+"-separierten Sivasnr-Wert (Rohformat aus den JSON-Katalogen, + dort weiterhin benoetigt fuer Dateinamen-Referenzen) in eine reine + kommaseparierte Liste fuer die Ausgabe (CSV/Block-Attribut) um. + """ + return ", ".join(p.strip() for p in str(sivasnr).split("+") if p.strip()) + + def format_hoehe_m(hoehe_mm_str): """Konvertiert mm-String nach m mit deutschem Dezimaltrennzeichen.""" try: @@ -190,7 +199,7 @@ def process_blocks(blocks, lookup): # --- Omniflo Bogen oder Weiche (erkannt via Katalog) --- if bname in lookup: typ, eintrag = lookup[bname] - sivasnr = str(eintrag.get("Sivasnr", bname)) + sivasnr = format_sivasnr(eintrag.get("Sivasnr", bname)) hoehe = get_hoehe_mm(block) if typ == "bogen": diff --git a/lib/set_attributs.py b/lib/set_attributs.py index 5c45080..dd8ab6b 100644 --- a/lib/set_attributs.py +++ b/lib/set_attributs.py @@ -149,12 +149,19 @@ def resolve_container_refs(text, container_map): kommaseparierte Liste aus [container]. Kommt das Muster mehrfach vor, wird jedes Vorkommen einzeln ersetzt. Unbekannte 0_BG-Werte bleiben unveraendert stehen. + + Anschliessend werden verbleibende "+"-Trenner (z.B. zwischen Artikelnr. + und 0_BG-Referenz) durch ", " ersetzt, damit SivasNummer ausschliesslich + eine kommaseparierte Liste ist. """ - if not container_map or "0_BG" not in text: - return text - return CONTAINER_PATTERN.sub( - lambda m: container_map.get(m.group(0), m.group(0)), text - ) + if container_map and "0_BG" in text: + text = CONTAINER_PATTERN.sub( + lambda m: container_map.get(m.group(0), m.group(0)), text + ) + if "+" in text: + parts = [p.strip() for p in text.split("+") if p.strip()] + text = ", ".join(parts) + return text def resolve_value(source, json_entry, sivasnr, container_map=None): @@ -164,9 +171,10 @@ def resolve_value(source, json_entry, sivasnr, container_map=None): - {sivasnr} -> SivasNr-Wert - Feldname -> Wert aus json_entry - Wird das Feld "Sivasnr" aufgeloest und enthaelt der Wert ein oder - mehrere 0_BGxxxxxx-Muster, werden diese anhand von [container] durch - die dort hinterlegte kommaseparierte Liste ersetzt. + Wird das Feld "Sivasnr" aufgeloest, werden enthaltene 0_BGxxxxxx-Muster + anhand von [container] durch die dort hinterlegte kommaseparierte Liste + ersetzt und verbleibende "+"-Trenner durch ", " ersetzt, sodass das + Ergebnis ausschliesslich eine kommaseparierte Liste ist (keine "+" mehr). """ source = source.strip() diff --git a/tests/test_omniflo.py b/tests/test_omniflo.py index 233f84b..2816277 100644 --- a/tests/test_omniflo.py +++ b/tests/test_omniflo.py @@ -22,7 +22,7 @@ sys.path.insert(0, _LIB_DIR) from export_csv import ( build_lookup, process_blocks, build_bogen_merkmale, - build_weiche_merkmale, load_json, format_csv_line + build_weiche_merkmale, load_json, format_csv_line, format_sivasnr ) @@ -207,8 +207,8 @@ class TestOmnifloExportUnit: assert m["Höhe"] == str(int(tc["hoehe"])), ( f"{sivasnr}: Hoehe erwartet={tc['hoehe']}, erhalten={m['Höhe']}" ) - assert m["SivasNummer"] == str(eintrag["Sivasnr"]), ( - f"{sivasnr}: SivasNummer erwartet={eintrag['Sivasnr']}, " + assert m["SivasNummer"] == format_sivasnr(eintrag["Sivasnr"]), ( + f"{sivasnr}: SivasNummer erwartet={format_sivasnr(eintrag['Sivasnr'])}, " f"erhalten={m['SivasNummer']}" ) @@ -233,8 +233,8 @@ class TestOmnifloExportUnit: assert m["Höhe"] == str(int(tc["hoehe"])), ( f"{sivasnr}: Hoehe erwartet={tc['hoehe']}, erhalten={m['Höhe']}" ) - assert m["SivasNummer"] == str(eintrag["Sivasnr"]), ( - f"{sivasnr}: SivasNummer erwartet={eintrag['Sivasnr']}, " + assert m["SivasNummer"] == format_sivasnr(eintrag["Sivasnr"]), ( + f"{sivasnr}: SivasNummer erwartet={format_sivasnr(eintrag['Sivasnr'])}, " f"erhalten={m['SivasNummer']}" ) expected_antrieb = eintrag.get("SivasnrTEF") is not None