book-generator-orgmode/fix_corrupted_csv.py
2025-08-30 18:14:14 +02:00

92 lines
No EOL
3.3 KiB
Python
Executable file

#!/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 <input_csv_file> [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()