import json def get_closest_col(x, current_cols): """Trouve la colonne dont l'X est le plus proche de la valeur.""" return min(current_cols, key=lambda c: abs(x - c[0])) def transform_to_clean_markdown(data): current_cols = [] output_lines = [] for entry in data: points = entry.get("points", []) if not points: continue # 1. Détection et formatage des En-têtes (Cxxxx) headers_in_row = [(p[0], p[2]) for p in points if str(p[2]).startswith('C')] if headers_in_row: # On ajoute un séparateur si un tableau existait déjà avant if output_lines: output_lines.append("\n---\n") current_cols = headers_in_row col_names = [c[1] for c in current_cols] # Header propre sans coordonnées output_lines.append(f"| Code | {' | '.join(col_names)} |") output_lines.append(f"| :--- | {' | '.join([':---'] * len(col_names))} |") continue # 2. Détection et alignement des Données (Rxxxx) row_label_pt = next((p for p in points if str(p[2]).startswith('R')), None) if row_label_pt and current_cols: row_label = row_label_pt[2] # Initialisation de la ligne avec des "0" row_dict = {c[1]: "0" for c in current_cols} for p in points: x_val, _, text = p if text == row_label: continue # Placement précis via coordonnée X best_col = get_closest_col(x_val, current_cols) row_dict[best_col[1]] = str(text).strip() # Construction de la ligne finale ordered_values = [row_dict[c[1]] for c in current_cols] output_lines.append(f"| **{row_label}** | {' | '.join(ordered_values)} |") # Note : On ignore volontairement le bloc "else" (INFO) pour nettoyer le bruit return "\n".join(output_lines) #print(transform_to_clean_markdown(json))