Skripts
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user