SPB Git
2.8 KB · 53 lines python
1#!/usr/bin/env python32"""Fusionne sources/registry-*.csv → sources/registry.csv, sources/normes-*.csv → sources/normes-matrice.csv,3references/lib-*.bib → references/library.bib (clés dédoublonnées, la première occurrence gagne ; library.bib hérité d'abord).4Idempotent : les fichiers fusionnés sont reconstruits à partir des fichiers sources + de la partie « héritée » de library.bib."""5import csv, re, pathlib, sys6ROOT = pathlib.Path(__file__).resolve().parents[1]7# --- registre8hdr = "id,type,titre,organisme,version_ou_date,url,date_consultation,statut,utilise_dans,notes".split(",")9rows = []10for f in sorted((ROOT / "sources").glob("registry-*.csv")):11    with f.open(encoding="utf-8") as fh:12        r = csv.DictReader(fh)13        for row in r:14            rows.append({k: (row.get(k) or "").strip() for k in hdr})15seen = set(); out = []16for row in rows:17    if row["id"] in seen or not row["id"]: continue18    seen.add(row["id"]); out.append(row)19with (ROOT / "sources/registry.csv").open("w", encoding="utf-8", newline="") as fh:20    w = csv.DictWriter(fh, fieldnames=hdr); w.writeheader(); w.writerows(out)21print(f"registry.csv : {len(out)} sources ({sum(1 for r in out if r['statut']=='verifie')} vérifiées)")22# --- normes23hdrn = "id,domaine,disposition,texte_source,reference_precise,effet_sur_evaluation,version_verifiee,date_consultation,chapitres".split(",")24nrows = []25for f in sorted((ROOT / "sources").glob("normes-*.csv")):26    if f.name == "normes-matrice.csv": continue27    with f.open(encoding="utf-8") as fh:28        for row in csv.DictReader(fh):29            nrows.append({k: (row.get(k) or "").strip() for k in hdrn})30with (ROOT / "sources/normes-matrice.csv").open("w", encoding="utf-8", newline="") as fh:31    w = csv.DictWriter(fh, fieldnames=hdrn); w.writeheader(); w.writerows(nrows)32print(f"normes-matrice.csv : {len(nrows)} dispositions")33# --- bib34lib = ROOT / "references/library.bib"35txt = lib.read_text(encoding="utf-8")36marker = "\n% ===== ENTRÉES VÉRIFIÉES (phase 1, fusion automatique de lib-*.bib) =====\n"37base = txt.split(marker)[0].rstrip() + "\n"38def keys(s): return re.findall(r"^@\w+\s*\{\s*([^,\s]+)\s*,", s, re.M)39have = set(keys(base)); added = []; dup = []40for f in sorted((ROOT / "references").glob("lib-*.bib")):41    s = f.read_text(encoding="utf-8")42    # découpe en entrées43    parts = re.split(r"(?m)^(?=@\w+\s*\{)", s)44    for p in parts:45        m = re.match(r"@\w+\s*\{\s*([^,\s]+)\s*,", p)46        if not m: continue47        k = m.group(1)48        if k in have: dup.append(f"{f.name}:{k}"); continue49        have.add(k); added.append(p.strip() + "\n")50lib.write_text(base + marker + "\n".join(added), encoding="utf-8")51print(f"library.bib : {len(have)} clés ({len(added)} ajoutées ; doublons ignorés : {len(dup)})")52if dup: print("  doublons :", ", ".join(dup[:20]))53
Files · 686c89db7c1ac1f7cb9dbede352cce68f9aa8ff7
Menu

Theme