edit README.md
This commit is contained in:
20
convert.py
20
convert.py
@@ -28,10 +28,10 @@ def nettoyer_csv_texte(csv_in_path, csv_out_path):
|
|||||||
with open(csv_in_path, "r", encoding="utf-8", errors="replace") as f:
|
with open(csv_in_path, "r", encoding="utf-8", errors="replace") as f:
|
||||||
lines = f.readlines()
|
lines = f.readlines()
|
||||||
|
|
||||||
# 1️⃣ Supprimer les 3 premières lignes quoi qu'il arrive
|
# 1 Supprimer les 3 premières lignes quoi qu'il arrive
|
||||||
lines = lines[3:]
|
lines = lines[3:]
|
||||||
|
|
||||||
# 2️⃣ Chercher la première ligne contenant MOT_DEBUT (SOLDE)
|
# 2 Chercher la première ligne contenant MOT_DEBUT (SOLDE)
|
||||||
idx_debut = None
|
idx_debut = None
|
||||||
for i, line in enumerate(lines):
|
for i, line in enumerate(lines):
|
||||||
if MOT_DEBUT.lower() in line.lower():
|
if MOT_DEBUT.lower() in line.lower():
|
||||||
@@ -41,7 +41,7 @@ def nettoyer_csv_texte(csv_in_path, csv_out_path):
|
|||||||
# Supprimer tout jusqu'à et y compris cette ligne
|
# Supprimer tout jusqu'à et y compris cette ligne
|
||||||
lines = lines[idx_debut + 1:]
|
lines = lines[idx_debut + 1:]
|
||||||
|
|
||||||
# 3️⃣ Supprimer à partir de la ligne contenant MOT_FIN (Total des mouvements)
|
# 3 Supprimer à partir de la ligne contenant MOT_FIN (Total des mouvements)
|
||||||
idx_fin = None
|
idx_fin = None
|
||||||
for i, line in enumerate(lines):
|
for i, line in enumerate(lines):
|
||||||
if MOT_FIN.lower() in line.lower():
|
if MOT_FIN.lower() in line.lower():
|
||||||
@@ -50,19 +50,19 @@ def nettoyer_csv_texte(csv_in_path, csv_out_path):
|
|||||||
if idx_fin is not None:
|
if idx_fin is not None:
|
||||||
lines = lines[:idx_fin]
|
lines = lines[:idx_fin]
|
||||||
|
|
||||||
# 4️⃣ Détection du séparateur sur un échantillon
|
# 4 Détection du séparateur sur un échantillon
|
||||||
sample = "".join(lines[:20])
|
sample = "".join(lines[:20])
|
||||||
delim = detect_delimiter(sample)
|
delim = detect_delimiter(sample)
|
||||||
|
|
||||||
# 5️⃣ Lecture en mode tolérant avec csv.reader
|
# 5 Lecture en mode tolérant avec csv.reader
|
||||||
reader = csv.reader(lines, delimiter=delim)
|
reader = csv.reader(lines, delimiter=delim)
|
||||||
rows = [row for row in reader]
|
rows = [row for row in reader]
|
||||||
|
|
||||||
# 6️⃣ Normaliser le nombre de colonnes (éviter erreurs si certaines lignes sont plus courtes)
|
# 6 Normaliser le nombre de colonnes (éviter erreurs si certaines lignes sont plus courtes)
|
||||||
max_cols = max(len(r) for r in rows) if rows else 0
|
max_cols = max(len(r) for r in rows) if rows else 0
|
||||||
rows = [r + [""] * (max_cols - len(r)) for r in rows]
|
rows = [r + [""] * (max_cols - len(r)) for r in rows]
|
||||||
|
|
||||||
# 7️⃣ Supprimer les lignes dont le premier champ contient "date" (sauf on garde une copie pour l'entête globale)
|
# 7 Supprimer les lignes dont le premier champ contient "date" (sauf on garde une copie pour l'entête globale)
|
||||||
header_line = None
|
header_line = None
|
||||||
filtered_rows = []
|
filtered_rows = []
|
||||||
for r in rows:
|
for r in rows:
|
||||||
@@ -73,7 +73,7 @@ def nettoyer_csv_texte(csv_in_path, csv_out_path):
|
|||||||
continue # ne pas inclure cette ligne dans ce fichier final
|
continue # ne pas inclure cette ligne dans ce fichier final
|
||||||
filtered_rows.append(r)
|
filtered_rows.append(r)
|
||||||
|
|
||||||
# 8️⃣ Fusionner les lignes dont la première colonne est vide avec la précédente
|
# 8 Fusionner les lignes dont la première colonne est vide avec la précédente
|
||||||
merged = []
|
merged = []
|
||||||
for r in filtered_rows:
|
for r in filtered_rows:
|
||||||
if (r[0] or "").strip() == "" and merged:
|
if (r[0] or "").strip() == "" and merged:
|
||||||
@@ -86,7 +86,7 @@ def nettoyer_csv_texte(csv_in_path, csv_out_path):
|
|||||||
else:
|
else:
|
||||||
merged.append(r)
|
merged.append(r)
|
||||||
|
|
||||||
# 9️⃣ Nettoyer les deux dernières colonnes : supprimer les points dans les nombres
|
# 9 Nettoyer les deux dernières colonnes : supprimer les points dans les nombres
|
||||||
if merged:
|
if merged:
|
||||||
for r in merged:
|
for r in merged:
|
||||||
if len(r) >= 2:
|
if len(r) >= 2:
|
||||||
@@ -96,7 +96,7 @@ def nettoyer_csv_texte(csv_in_path, csv_out_path):
|
|||||||
# Avant-dernière colonne
|
# Avant-dernière colonne
|
||||||
r[-2] = r[-2].replace(".", "")
|
r[-2] = r[-2].replace(".", "")
|
||||||
|
|
||||||
# 🔟 Sauvegarde du fichier nettoyé
|
# 10 Sauvegarde du fichier nettoyé
|
||||||
with open(csv_out_path, "w", encoding="utf-8", newline="") as f:
|
with open(csv_out_path, "w", encoding="utf-8", newline="") as f:
|
||||||
writer = csv.writer(f, delimiter=delim)
|
writer = csv.writer(f, delimiter=delim)
|
||||||
writer.writerows(merged)
|
writer.writerows(merged)
|
||||||
|
|||||||
Reference in New Issue
Block a user