92 lines
No EOL
3.3 KiB
Python
Executable file
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() |