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 <noreply@anthropic.com>
This commit is contained in:
2026-08-21 11:46:36 +02:00
parent dc2b0b8900
commit 966bfa866d
+25
View File
@@ -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 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) csv:block-to-json), werden aber ebenfalls nur von diesem Skript (EXPORTCSV)
als CSV-Spalten ausgegeben. 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 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) elem_nr = build_kreisel_weiche_items(items, planquadrat_cfg, elem_nr, dbg=dbg)
build_strecke_schleus_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 return items