#!/usr/bin/env python3 """ Script pour réparer les fichiers CSV contenant des dates corrompues avec des caractères nuls. Ce script lit un fichier CSV, nettoie les dates corrompues, et écrit un nouveau fichier CSV corrigé. """ import csv import re import os import sys from datetime import datetime def fix_corrupted_csv(input_file, output_file=None, delimiter=';'): """ Répare un fichier CSV contenant des dates corrompues avec des caractères nuls. Args: input_file: Chemin vers le fichier CSV à réparer output_file: Chemin vers le fichier CSV de sortie (si None, ajoute '_fixed' au nom du fichier d'entrée) delimiter: Délimiteur utilisé dans le fichier CSV Returns: Le chemin vers le fichier CSV réparé """ if output_file is None: base, ext = os.path.splitext(input_file) output_file = f"{base}_fixed{ext}" fixed_rows = [] corrupted_count = 0 total_count = 0 # Lire le fichier CSV d'entrée with open(input_file, 'r') as csvfile: reader = csv.reader(csvfile, delimiter=delimiter) for row in reader: total_count += 1 if not row: continue try: # Vérifier si la date est corrompue date_str = row[0] try: # Essayer de parser la date directement datetime.fromisoformat(date_str) except ValueError: # Si la date est corrompue, essayer de l'extraire avec regex match = re.search(r'\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?', date_str) if match: # Remplacer la date corrompue par la date extraite row[0] = match.group(0) corrupted_count += 1 print(f"Date corrompue réparée: {date_str} -> {row[0]}") else: print(f"AVERTISSEMENT: Impossible de réparer la date: {date_str}") fixed_rows.append(row) except Exception as e: print(f"ERREUR lors du traitement de la ligne: {e}") # Écrire le fichier CSV réparé with open(output_file, 'w', newline='') as csvfile: writer = csv.writer(csvfile, delimiter=delimiter) writer.writerows(fixed_rows) print(f"\nRésumé:") print(f"Total des lignes traitées: {total_count}") print(f"Lignes corrompues réparées: {corrupted_count}") print(f"Fichier réparé sauvegardé sous: {output_file}") return output_file def main(): if len(sys.argv) < 2: print("Usage: python fix_corrupted_csv.py [output_csv_file] [delimiter]") sys.exit(1) input_file = sys.argv[1] output_file = sys.argv[2] if len(sys.argv) > 2 else None delimiter = sys.argv[3] if len(sys.argv) > 3 else ';' if not os.path.exists(input_file): print(f"ERREUR: Le fichier {input_file} n'existe pas.") sys.exit(1) fixed_file = fix_corrupted_csv(input_file, output_file, delimiter) print(f"\nPour utiliser le fichier réparé avec follow_progress.py, exécutez:") print(f"python follow_progress.py {fixed_file}") if __name__ == "__main__": main()