llm_ticket3/agents/utils/csv_exporter.py
2025-04-14 11:19:55 +02:00

107 lines
4.2 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import json
import csv
import os
import sys
def generate_csv_from_json(json_file, model_name=None):
"""
Génère un fichier CSV à partir des données du tableau questions/réponses
contenues dans le fichier JSON du rapport.
Args:
json_file (str): Chemin du fichier JSON contenant les données
model_name (str, optional): Nom du modèle à inclure dans le nom du fichier
Returns:
str: Chemin du fichier CSV généré
"""
# Extraire l'ID du ticket du nom du fichier
ticket_id = os.path.basename(json_file).split('_')[0]
# Créer le répertoire CSV à la racine du projet
project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
csv_root_dir = os.path.join(project_root, 'CSV')
ticket_csv_dir = os.path.join(csv_root_dir, ticket_id)
# Créer les répertoires si nécessaire
os.makedirs(ticket_csv_dir, exist_ok=True)
# Définir le nom du fichier CSV de sortie
if model_name:
csv_file = os.path.join(ticket_csv_dir, f"{ticket_id}_{model_name}.csv")
else:
# Si le modèle n'est pas spécifié, utiliser les métadonnées du JSON
with open(json_file, 'r', encoding='utf-8') as f:
data = json.load(f)
model_name = data.get('metadata', {}).get('model', 'unknown')
csv_file = os.path.join(ticket_csv_dir, f"{ticket_id}_{model_name}.csv")
# Ouvrir le fichier JSON
with open(json_file, 'r', encoding='utf-8') as f:
data = json.load(f)
# Extraire les échanges
exchanges = data.get('chronologie_echanges', [])
if not exchanges:
print(f"Aucun échange trouvé dans {json_file}")
return None
# Ouvrir le fichier CSV pour écriture
with open(csv_file, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
# Écrire l'en-tête
writer.writerow(['Question', 'Réponse'])
current_question = None
current_answers = []
# Parcourir les échanges pour les combiner en paires questions/réponses
for exchange in exchanges:
emetteur = exchange.get('emetteur', '').upper()
type_msg = exchange.get('type', '').lower()
contenu = exchange.get('contenu', '')
# Si c'est une question client
if emetteur == 'CLIENT' and (type_msg == 'question' or '?' in contenu):
# Si une question précédente existe, l'écrire avec ses réponses
if current_question:
combined_answer = "\n".join(current_answers) if current_answers else "Pas de réponse"
writer.writerow([current_question, combined_answer])
# Réinitialiser pour la nouvelle question
current_question = contenu
current_answers = []
# Si c'est une réponse ou un complément du support
elif emetteur == 'SUPPORT' and (type_msg == 'réponse' or type_msg == 'complément visuel' or type_msg == 'information technique'):
if current_question: # S'assurer qu'il y a une question en cours
# Ajouter le contenu sans préfixe
current_answers.append(contenu)
# Écrire la dernière question et ses réponses
if current_question:
combined_answer = "\n".join(current_answers) if current_answers else "Pas de réponse"
writer.writerow([current_question, combined_answer])
print(f"Fichier CSV créé: {csv_file}")
return csv_file
if __name__ == "__main__":
# Vérifier si un chemin de fichier est fourni en argument
if len(sys.argv) > 1:
json_file = sys.argv[1]
else:
print("Erreur: Veuillez spécifier le chemin du fichier JSON.")
print("Usage: python csv_exporter.py chemin/vers/rapport_final.json [nom_modele]")
sys.exit(1)
# Vérifier si un nom de modèle est fourni en second argument
model_name = sys.argv[2] if len(sys.argv) > 2 else None
# Générer le CSV
generate_csv_from_json(json_file, model_name)