Format der SivasNummer ohne +

This commit is contained in:
2026-07-10 13:34:10 +02:00
parent fe283a0bf3
commit 554e9bee99
4 changed files with 42 additions and 16 deletions
+11 -2
View File
@@ -52,6 +52,15 @@ def build_lookup(boegen, weichen):
return lookup 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 # Merkmale-Builder
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
@@ -80,7 +89,7 @@ def build_bogen_merkmale(block, eintrag):
"Radius": float(eintrag.get("Radius", 0)), "Radius": float(eintrag.get("Radius", 0)),
"Höhe": get_hoehe(block), "Höhe": get_hoehe(block),
"Drehung": get_drehung(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), "Höhe": get_hoehe(block),
"Drehung": get_drehung(block), "Drehung": get_drehung(block),
"Antrieb Kurve": eintrag.get("SivasnrTEF") is not None, "Antrieb Kurve": eintrag.get("SivasnrTEF") is not None,
"SivasNummer": str(eintrag.get("Sivasnr", "")) "SivasNummer": format_sivasnr(eintrag.get("Sivasnr", ""))
} }
+10 -1
View File
@@ -83,6 +83,15 @@ def get_id(block):
return block.get("attribs", {}).get("ID", "") 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): def format_hoehe_m(hoehe_mm_str):
"""Konvertiert mm-String nach m mit deutschem Dezimaltrennzeichen.""" """Konvertiert mm-String nach m mit deutschem Dezimaltrennzeichen."""
try: try:
@@ -190,7 +199,7 @@ def process_blocks(blocks, lookup):
# --- Omniflo Bogen oder Weiche (erkannt via Katalog) --- # --- Omniflo Bogen oder Weiche (erkannt via Katalog) ---
if bname in lookup: if bname in lookup:
typ, eintrag = lookup[bname] typ, eintrag = lookup[bname]
sivasnr = str(eintrag.get("Sivasnr", bname)) sivasnr = format_sivasnr(eintrag.get("Sivasnr", bname))
hoehe = get_hoehe_mm(block) hoehe = get_hoehe_mm(block)
if typ == "bogen": if typ == "bogen":
+16 -8
View File
@@ -149,12 +149,19 @@ def resolve_container_refs(text, container_map):
kommaseparierte Liste aus [container]. Kommt das Muster mehrfach vor, kommaseparierte Liste aus [container]. Kommt das Muster mehrfach vor,
wird jedes Vorkommen einzeln ersetzt. Unbekannte 0_BG-Werte bleiben wird jedes Vorkommen einzeln ersetzt. Unbekannte 0_BG-Werte bleiben
unveraendert stehen. 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: if container_map and "0_BG" in text:
return text text = CONTAINER_PATTERN.sub(
return CONTAINER_PATTERN.sub( lambda m: container_map.get(m.group(0), m.group(0)), text
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): 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 - {sivasnr} -> SivasNr-Wert
- Feldname -> Wert aus json_entry - Feldname -> Wert aus json_entry
Wird das Feld "Sivasnr" aufgeloest und enthaelt der Wert ein oder Wird das Feld "Sivasnr" aufgeloest, werden enthaltene 0_BGxxxxxx-Muster
mehrere 0_BGxxxxxx-Muster, werden diese anhand von [container] durch anhand von [container] durch die dort hinterlegte kommaseparierte Liste
die dort hinterlegte kommaseparierte Liste ersetzt. ersetzt und verbleibende "+"-Trenner durch ", " ersetzt, sodass das
Ergebnis ausschliesslich eine kommaseparierte Liste ist (keine "+" mehr).
""" """
source = source.strip() source = source.strip()
+5 -5
View File
@@ -22,7 +22,7 @@ sys.path.insert(0, _LIB_DIR)
from export_csv import ( from export_csv import (
build_lookup, process_blocks, build_bogen_merkmale, 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"])), ( assert m["Höhe"] == str(int(tc["hoehe"])), (
f"{sivasnr}: Hoehe erwartet={tc['hoehe']}, erhalten={m['Höhe']}" f"{sivasnr}: Hoehe erwartet={tc['hoehe']}, erhalten={m['Höhe']}"
) )
assert m["SivasNummer"] == str(eintrag["Sivasnr"]), ( assert m["SivasNummer"] == format_sivasnr(eintrag["Sivasnr"]), (
f"{sivasnr}: SivasNummer erwartet={eintrag['Sivasnr']}, " f"{sivasnr}: SivasNummer erwartet={format_sivasnr(eintrag['Sivasnr'])}, "
f"erhalten={m['SivasNummer']}" f"erhalten={m['SivasNummer']}"
) )
@@ -233,8 +233,8 @@ class TestOmnifloExportUnit:
assert m["Höhe"] == str(int(tc["hoehe"])), ( assert m["Höhe"] == str(int(tc["hoehe"])), (
f"{sivasnr}: Hoehe erwartet={tc['hoehe']}, erhalten={m['Höhe']}" f"{sivasnr}: Hoehe erwartet={tc['hoehe']}, erhalten={m['Höhe']}"
) )
assert m["SivasNummer"] == str(eintrag["Sivasnr"]), ( assert m["SivasNummer"] == format_sivasnr(eintrag["Sivasnr"]), (
f"{sivasnr}: SivasNummer erwartet={eintrag['Sivasnr']}, " f"{sivasnr}: SivasNummer erwartet={format_sivasnr(eintrag['Sivasnr'])}, "
f"erhalten={m['SivasNummer']}" f"erhalten={m['SivasNummer']}"
) )
expected_antrieb = eintrag.get("SivasnrTEF") is not None expected_antrieb = eintrag.get("SivasnrTEF") is not None