Discussion:SplitCDR

De INDYWiki
Révision datée du 28 mars 2024 à 16:13 par Anthony (discussion | contributions) (Page créée avec « import os import csv from datetime import timedelta # Fonction pour convertir la durée en format HH:MM:SS def convert_to_hms(duration): duration_seconds = int(duration) hours, remainder = divmod(duration_seconds, 3600) minutes, seconds = divmod(remainder, 60) return f"{hours}h{minutes}m{seconds}s" # Fonction pour convertir les kilooctets en gigaoctets et arrondir au centième def convert_to_gb(data_volume): return round(float(data_volume) /... »)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)

import os import csv from datetime import timedelta

  1. Fonction pour convertir la durée en format HH:MM:SS

def convert_to_hms(duration):

   duration_seconds = int(duration)
   hours, remainder = divmod(duration_seconds, 3600)
   minutes, seconds = divmod(remainder, 60)
   return f"{hours}h{minutes}m{seconds}s"
  1. Fonction pour convertir les kilooctets en gigaoctets et arrondir au centième

def convert_to_gb(data_volume):

   return round(float(data_volume) / 1000000, 2)  # 1 gigaoctet = 1 000 000 kilooctets
  1. Fonction pour agréger les données par client et caller

def aggregate_data(data):

   client_data = {}
   for row in data:
       client_name = row['client_name']
       caller = row['caller']
       if client_name not in client_data:
           client_data[client_name] = {}
       if caller not in client_data[client_name]:
           client_data[client_name][caller] = {
               'caller': caller,
               'duration': 0.0,
               'price': 0.0,
               'sva_service_cost': 0.0,
               'data_volume': 0.0,
               'categories': {}  # Dictionnaire pour stocker les résultats par catégorie
           }
       client_data[client_name][caller]['duration'] += float(row['duration']) if row['duration'] else 0.0
       client_data[client_name][caller]['price'] += float(row['price']) if row['price'] else 0.0
       client_data[client_name][caller]['sva_service_cost'] += float(row['sva_service_cost']) if row['sva_service_cost'] else 0.0
       client_data[client_name][caller]['data_volume'] += float(row['data_volume']) if row['data_volume'] else 0.0
       
       # Mettre à jour les résultats par catégorie
       category = row['category']
       client_data[client_name][caller]['categories'][category] = client_data[client_name][caller]['categories'].get(category, 0) + 1
   return client_data
  1. Fonction pour écrire les données agrégées dans un fichier CSV

def write_aggregated_data(client_data, file_name):

   for client_name, client_info in client_data.items():
       output_dir = os.path.splitext(file_name)[0] + "_split"
       os.makedirs(output_dir, exist_ok=True)
       
       # Écrire le fichier résultant pour chaque client
       output_file = os.path.join(output_dir, f"{client_name}.csv")
       with open(output_file, 'w', newline=, encoding='utf-8') as file:
           writer = csv.writer(file, delimiter=';')
           # Récupérer toutes les colonnes possibles
           all_columns = set()
           for caller_info in client_info.values():
               all_columns.update(caller_info['categories'].keys())
           
           # Supprimer les colonnes avec des données non significatives (toutes les valeurs à zéro)
           significant_columns = [col for col in all_columns if any(caller_info['categories'].get(col, 0) != 0 for caller_info in client_info.values())]
           # Écrire l'en-tête avec les colonnes significatives
           header = ['caller', 'duration', 'price', 'sva_service_cost', 'data_volume'] + list(significant_columns)
           writer.writerow(header)
           # Écrire les données agrégées pour chaque caller du client
           for caller, caller_info in client_info.items():
               caller_info['duration'] = convert_to_hms(caller_info['duration'])
               caller_info['data_volume'] = convert_to_gb(caller_info['data_volume'])
               row = [
                   caller_info['caller'],
                   caller_info['duration'],
                   caller_info['price'],
                   caller_info['sva_service_cost'],
                   caller_info['data_volume']
               ]
               # Ajouter les résultats par catégorie à la ligne
               for category in significant_columns:
                   row.append(caller_info['categories'].get(category, 0))
               writer.writerow(row)
   print("Les fichiers traités ont été enregistrés avec succès dans le répertoire:", output_dir)
  1. Recherche de fichiers CSV dans le même répertoire que le script

csv_files = [file for file in os.listdir() if file.endswith('.csv')] if not csv_files:

   print("Aucun fichier CSV trouvé dans le répertoire.")
   exit()

for file_name in csv_files:

   # Lire le fichier CSV en spécifiant le séparateur
   data = []
   with open(file_name, 'r', newline=, encoding='utf-8') as file:
       reader = csv.DictReader(file, delimiter=';')
       for row in reader:
           # Exclure les lignes dont le "caller" ne commence pas par '06' ou '07' ou contient un "master_number"
           if row['caller'].startswith(('06', '07')) and not row['master_number']:
               data.append(row)
   # Agréger les données par client et caller
   client_data = aggregate_data(data)
   # Écrire les données agrégées dans un fichier CSV
   write_aggregated_data(client_data, file_name)