Files
wfrp-4e-de/python/merge_neu.py
T
alzerandalzer 0bcbc29f0f Skripts
2025-05-15 21:36:04 +02:00

117 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import json
import sys
import os
# Felder, die ersetzt werden sollen, wenn sie in der Quelle vorhanden sind
REPLACEMENT_FIELDS = [
"permanent",
"symptoms",
"contraction",
"name",
"description",
"durationValue",
"durationUnit",
"incubationValue",
"incubationUnit",
"results"
]
def merge_entry(target, source, warn_ids):
sid = source.get("id", "unbekannt")
# Standardfelder ersetzen
for field in REPLACEMENT_FIELDS:
if field in source:
target[field] = source[field]
# Effekte bearbeiten
source_effects = source.get('effects', [])
target_effects = target.get('effects', [])
# Effekte vergleichen und nur anhängen, wenn sie unterschiedlich sind
if isinstance(source_effects, list) and isinstance(target_effects, list):
for source_effect in source_effects:
if source_effect not in target_effects:
target_effects.append(source_effect)
# Label in Ziel-Effekten aktualisieren
new_name = source.get("name", target.get("name"))
for effect in target_effects:
if isinstance(effect, dict):
effect["label"] = new_name
# Aktualisierte Effekte zurückschreiben
target["effects"] = target_effects
elif isinstance(source_effects, list):
# Wenn Ziel keine Liste ist, aber Quelle schon, einfach ersetzen
target["effects"] = source_effects
else:
# Unerwartetes Format protokollieren
warn_ids.append(sid)
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)
# Ursprungsstruktur beibehalten
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())
# Datei überschreiben
with open(output_file or target_file, "w", encoding="utf-8") as f:
json.dump(final_output, f, indent=4, ensure_ascii=False)
# Neue IDs dokumentieren
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}")
# Warnungen dokumentieren
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_deduplicated.py ziel.json quelle1.json [quelle2.json ...]
if __name__ == "__main__":
if len(sys.argv) < 3:
print("Nutzung: python merge_items_with_effects_deduplicated.py ziel.json quelle1.json [quelle2.json ...]")
sys.exit(1)
target = sys.argv[1]
sources = sys.argv[2:]
merge_files(target, sources)