From e41b878920683b61084d795fb546fc2f43de9e01 Mon Sep 17 00:00:00 2001 From: alzer Date: Mon, 5 May 2025 23:25:29 +0200 Subject: [PATCH] =?UTF-8?q?Merge-Skript=20f=C3=BCr=20bestehende=20=C3=9Cbe?= =?UTF-8?q?rsetzungen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- merge_neu.py | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 merge_neu.py diff --git a/merge_neu.py b/merge_neu.py new file mode 100644 index 0000000..52d17ca --- /dev/null +++ b/merge_neu.py @@ -0,0 +1,101 @@ +import json +import sys +import os + +def merge_entry(target, source, warn_ids): + sid = source.get("id", "unbekannt") + + # Name ersetzen + new_name = source.get('name', target.get('name')) + target['name'] = new_name + + # Beschreibung ergänzen + source_desc = source.get('description', '') + target_desc = target.get('description', '') + if source_desc and target_desc: + target['description'] = source_desc + "\n\n" + target_desc + elif source_desc: + target['description'] = source_desc + + # Trappings ersetzen + if 'trappings' in source: + target['trappings'] = source['trappings'] + + # Effekte bearbeiten + source_effects = source.get('effects', []) + target_effects = target.get('effects', []) + + # Labels in Ziel-Effekten ersetzen + if isinstance(target_effects, list): + for effect in target_effects: + if isinstance(effect, dict): + effect['label'] = new_name + else: + warn_ids.append(sid) + target_effects = [] + + # Neue Effekte anhängen + if isinstance(source_effects, list) and source_effects: + target_effects.extend(source_effects) + target['effects'] = target_effects + + return target + +def merge_files(target_file, source_files, output_file=None, new_ids_log="new_ids.txt", warn_log="warn_ids.txt"): + with open(target_file, "r", encoding="utf-8") as f: + target_json = json.load(f) + + target_entries = target_json.get("entries", target_json) + target_by_id = {entry["id"]: entry for entry in target_entries} + new_ids = [] + warn_ids = [] + + for source_path in source_files: + print(f"🔄 Verarbeite {source_path} ...") + with open(source_path, "r", encoding="utf-8") as f: + source_json = json.load(f) + + source_entries = source_json.get("entries", source_json) + + for source_entry in source_entries: + sid = source_entry.get("id") + if not sid: + print("⚠️ Eintrag ohne ID übersprungen.") + continue + + if sid in target_by_id: + target_by_id[sid] = merge_entry(target_by_id[sid], source_entry, warn_ids) + else: + target_by_id[sid] = source_entry + new_ids.append(sid) + + if "entries" in target_json: + target_json["entries"] = list(target_by_id.values()) + final_output = target_json + else: + final_output = list(target_by_id.values()) + + with open(output_file or target_file, "w", encoding="utf-8") as f: + json.dump(final_output, f, indent=4, ensure_ascii=False) + + if new_ids: + with open(new_ids_log, "w", encoding="utf-8") as f: + f.write("\n".join(new_ids)) + print(f"🆕 {len(new_ids)} neue IDs – siehe {new_ids_log}") + + if warn_ids: + with open(warn_log, "w", encoding="utf-8") as f: + f.write("\n".join(warn_ids)) + print(f"⚠️ {len(warn_ids)} Items mit ungültigen 'effects' – siehe {warn_log}") + + print(f"📁 Merge abgeschlossen → Datei überschrieben: {target_file}") + +# Aufruf: python merge_items_with_effects_overwrite.py ziel.json quelle1.json [quelle2.json ...] +if __name__ == "__main__": + if len(sys.argv) < 3: + print("Nutzung: python merge_items_with_effects_overwrite.py ziel.json quelle1.json [quelle2.json ...]") + sys.exit(1) + + target = sys.argv[1] + sources = sys.argv[2:] + merge_files(target, sources)