Outils Rust pour l’analyse et la réparation de fichiers CSV volumineux et complexes.
Ce projet propose plusieurs utilitaires en ligne de commande pour :
- Extraire l’en-tête d’un fichier CSV
- Compter le nombre de lignes
- Analyser la structure (nombre de champs par ligne)
- Analyser les valeurs distinctes d’un champ
- Réparer la structure de fichiers CSV corrompus ou ambigus
Ces outils sont adaptés aux fichiers volumineux (plusieurs millions de lignes) et aux cas complexes (champs multi-lignes, encodages variés, séparateurs ambigus).
- Rust (edition 2024)
- Compilation :
cd csv_tools cargo build --release
Chaque outil est un binaire indépendant, à lancer avec cargo run --bin <nom> -- <options> ou via l’exécutable compilé.
- But : Extraire l’en-tête du CSV et générer
ListeVariablesContrats.txt - Options :
--file <chemin>: chemin du fichier CSV--encoding <encodage>: utf-8, windows-1252, etc.--delimiter <séparateur>:,ou;ou\t
- Exemple :
cargo run --bin extract_header -- --file Evenements_anon.csv --delimiter ','
- But : Compter le nombre de lignes du fichier
- Options : idem
- Exemple :
cargo run --bin count_lines -- --file Evenements_anon.csv --max 10000 --delimiter ','
- But : Analyser la distribution du nombre de champs par ligne
- Options :
--file <chemin>--encoding <encodage>--delimiter <séparateur>--max <N>
- Exemple :
cargo run --bin count_fields -- --file Evenements_anon.csv --delimiter ',' --max 1000
- But : Compter les valeurs distinctes d’un champ donné
- Options :
--file <chemin>--encoding <encodage>--delimiter <séparateur>--field-name <nom>ou--field-index <idx>--max <N>
- Exemple :
cargo run --bin analyze_field_raw -- --file Evenements_anon.csv --field-index 2 --max 1000 --delimiter ','
- But : Corriger la structure du CSV en marquant les lignes incohérentes (nombre de champs différent du nombre attendu).
- Fonctionnement :
- Lit le fichier ligne par ligne (mode tolérant).
- Les lignes avec le bon nombre de champs sont recopiées telles quelles.
- Les lignes avec un nombre de champs différent sont marquées en début de ligne par
#BAD (N champs)et conservées dans le fichier de sortie. - Permet d’identifier rapidement les lignes problématiques pour une correction manuelle ou un post-traitement.
- À utiliser : pour obtenir un CSV “propre” où toutes les lignes sont présentes, mais les lignes incorrectes sont signalées.
- Exemple :
cargo run --bin repair_csv -- --file Evenements_anon.csv --delimiter ',' --output Evenements_anon_corrected.csv --expected-fields 93 --max 100000
- But : Correction automatique de la structure du CSV, en tentant de fusionner intelligemment les champs éclatés en se basant sur l'inférence de type des colonnes.
- Fonctionnement :
- Lit le fichier ligne par ligne en utilisant un parseur CSV robuste.
- Inférence de Type (Optionnel): Si activé (
--inference-lines > 0), le programme lit d'abord un échantillon de lignes ayant le nombre de champs attendu pour inférer le type de chaque colonne (Numérique ou Texte). Le séparateur décimal utilisé pour cette inférence peut être spécifié (ex:--decimal-separator ','). - Les lignes avec le nombre de champs attendu (
--expected-fields) sont recopiées telles quelles. - Fusion Intelligente (si inférence active): Pour les lignes ayant plus de champs que prévu, le programme tente de fusionner les champs adjacents. Une fusion est considérée valide si le champ résultant correspond au type inféré pour la colonne cible. Il essaie de trouver une combinaison de fusions qui produit le nombre correct de champs, chacun respectant son type.
- Fusion Basique (si inférence inactive ou échoue): Si l'inférence de type n'est pas active ou si la fusion intelligente ne trouve pas de solution valide, les champs en excès sont fusionnés de manière basique dans le dernier champ attendu (comportement précédent), ou la ligne est marquée comme
#BAD_MERGE_FAILEDou#BAD_EXCESS_NO_INFERENCE. - Les lignes avec trop peu de champs sont marquées comme irrécupérables (ex:
#BAD_FEW (N champs)). - Produit un CSV où les lignes problématiques sont soit corrigées intelligemment, soit clairement marquées.
- Options (en plus de celles de
repair_csv):--inference-lines <N>: Nombre de lignes "correctes" à analyser pour inférer les types de colonnes (par défaut: 1000). Mettre à 0 pour désactiver l'inférence et la fusion intelligente.--decimal-separator <char>: Caractère utilisé comme séparateur décimal lors de l'inférence de type pour les champs numériques (par défaut: '.').
- À utiliser : pour obtenir un CSV “corrigé” automatiquement, prêt à être exploité, même si certaines lignes peuvent être imparfaites.
- Exemple :
cargo run --bin repair_csv_auto -- --file Evenements_anon.csv --delimiter ',' --output Evenements_anon_corrected_auto.csv --expected-fields 93 --max 100000 --inference-lines 5000 --decimal-separator ','
- But : Effectuer en un seul passage sur le fichier CSV : extraction d’entête, comptage de lignes, distribution du nombre de champs, analyse de plusieurs champs, et réparation automatique.
- Fonctionnement :
- Lit le fichier ligne par ligne (streaming, très efficace).
- À chaque ligne : met à jour le compteur de lignes, la distribution du nombre de champs, la distribution des valeurs pour chaque champ à analyser, et écrit la version réparée de la ligne dans un fichier de sortie.
- Écrit l’entête dans
ListeVariablesContrats.txtà la première ligne. - Permet d’obtenir tous les résultats d’analyse et un CSV corrigé en une seule lecture du fichier.
- À utiliser : pour gagner du temps sur les très gros fichiers, éviter de relire plusieurs fois, et obtenir toutes les analyses et corrections en une seule commande.
- Exemple :
(Ici, on analyse les distributions du champ 2 et du champ 5, en plus de toutes les autres analyses.)
cargo run --bin hyper_csv_analyze -- --file Evenements_anon.csv --delimiter ',' --expected-fields 93 --analyze-fields 2,5 --output Evenements_anon_hyper_corrected.csv --max 100000
cargo run --bin extract_header -- --file Evenements_anon.csv --delimiter ','
cargo run --bin count_lines -- --file Evenements_anon.csv --max 10000 --delimiter ','
cargo run --bin count_fields -- --file Evenements_anon.csv --delimiter ',' --max 100000
cargo run --bin analyze_field -- --file Evenements_anon.csv --field-name "TYPE_EVENEMENT" --max 50000 --delimiter ','
cargo run --bin hyper_csv_analyze -- --file Evenements_anon.csv --delimiter ',' --expected-fields 93 --analyze-fields 2,5 --output Evenements_anon_hyper_corrected.csv --max 100000- Utiliser l’option
--maxpour limiter le nombre de lignes traitées lors des premiers tests
Projet pédagogique – Université ISFA 2024-2025