From 966bfa866d9c4cdf8c362883bd7d0f00af396cab Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Fri, 21 Aug 2026 11:46:36 +0200 Subject: [PATCH] Export CSV: Zeilen nach TeileId sortieren, Elementnummer neu vergeben Damit stimmen Elementnummer (erste Spalte) und TeileId ueberein, solange kein Element geloescht wurde - geloeschte Elemente hinterlassen Luecken in der TeileId-Folge statt in der Zeilennummerierung. Co-Authored-By: Claude Sonnet 5 --- lib/export_csv.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/lib/export_csv.py b/lib/export_csv.py index 35319fa..bc6c89a 100644 --- a/lib/export_csv.py +++ b/lib/export_csv.py @@ -84,6 +84,15 @@ EXPORTCSV vorhanden (nicht EXPORTSIVAS) - siehe csv:run-export. Insertpoint/ K1-K4 stehen zwar in export_raw.json fuer jeden Export zur Verfuegung (siehe csv:block-to-json), werden aber ebenfalls nur von diesem Skript (EXPORTCSV) als CSV-Spalten ausgegeben. + +Reihenfolge/Elementnummer: die Zeilen werden am Ende aufsteigend nach +TeileId sortiert (numerische IDs) und die Elementnummer (erste Spalte) +danach neu von 1 an vergeben (siehe teileid_sort_key in process_blocks) - +wurde kein Element geloescht, stimmen Elementnummer und TeileId dadurch +ueberein, geloeschte Elemente hinterlassen Luecken in der TeileId-Folge. +Zeilen ohne numerische TeileId (Omniflo-Sum-Zeile, SEP-/SCN-Fallback-IDs +ohne ID-Attribut) behalten stabil ihre bisherige Reihenfolge und stehen +danach. """ import json @@ -816,6 +825,22 @@ def process_blocks(blocks, lookup, dbg=None): elem_nr = build_kreisel_weiche_items(items, planquadrat_cfg, elem_nr, dbg=dbg) build_strecke_schleus_items(items, planquadrat_cfg, elem_nr, dbg=dbg) + # Nach dem Sammelheimen aller Zeilen: sortiert nach TeileId ausgeben, damit + # Elementnummer (erste Spalte) und TeileId nach Moeglichkeit uebereinstimmen + # (siehe format_csv_line/Elementnummer-Neuvergabe unten). Numerische IDs + # zuerst aufsteigend; nicht-numerische IDs (z.B. "autogenerated_of_json" + # der Omniflo-Sum-Zeile oder SEP-/SCN-Fallback-IDs ohne ID-Attribut) + # behalten stabil ihre bisherige Reihenfolge und stehen danach. Wurde kein + # Element geloescht, ergibt sich dadurch Elementnummer == TeileId. + def teileid_sort_key(indexed_item): + index, item = indexed_item + tid = str(item.get("teileid", "")).strip() + return (0, int(tid)) if tid.isdigit() else (1, index) + + items = [item for _, item in sorted(enumerate(items), key=teileid_sort_key)] + for i, item in enumerate(items, start=1): + item["nr"] = i + return items