117 lines
3.8 KiB
Python
117 lines
3.8 KiB
Python
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)
|