Travailler avec CSV en Rust : bibliothèque csv et traitement de données

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Travailler avec CSV en Rust : bibliothèque csv et exemples pratiques



Le format CSV (Comma-Separated Values) reste l'un des moyens les plus populaires pour stocker des données tabulaires. En Rust, il existe une bibliothèque mature et performante csv pour travailler avec CSV, qui offre une API pratique pour la lecture, l'écriture et le traitement des données. Dans cet article, nous allons détailler comment travailler efficacement avec CSV en Rust.



Installation et ajout de la bibliothèque



Pour commencer, ajoutez la dépendance dans le fichier Cargo.toml :



[dependencies]csv = "1.3"


La bibliothèque csv prend en charge le travail avec les encodages, les délimiteurs et les guillemets personnalisables, et offre également la possibilité de sérialisation/désérialisation des données via les traits serde.



Lecture d'un fichier CSV



La façon la plus simple de lire un CSV est d'utiliser csv::Reader. Considérons un exemple avec le fichier users.csv :



use std::error::Error;use csv::ReaderBuilder;

fn main() -> Result<(), Box<dyn Error>> { // Création d'un lecteur avec paramètres let mut rdr = ReaderBuilder::new() .has_headers(true) // première ligne = en-têtes .delimiter(b',') // délimiteur = virgule .from_path("users.csv")?;

// Affichage des en-têtes let headers = rdr.headers()?; println!("En-têtes : {:?}", headers);

// Itération sur les enregistrements for result in rdr.records() { let record = result?; println!("{:?}", record); } Ok(())}


Traitement des enregistrements avec désérialisation



Pour travailler avec des données structurées, il est pratique d'utiliser la désérialisation dans des structures personnalisées. Ajoutez serde et serde_derive :



[dependencies]csv = "1.3"serde = { version = "1.0", features = ["derive"] }


Vous pouvez maintenant définir une structure et lire les données directement :



use serde::Deserialize;

#[derive(Debug, Deserialize)]struct User { name: String, age: u8, email: String,}

fn main() -> Result<(), Box<dyn std::error::Error>> { let mut rdr = csv::Reader::from_path("users.csv")?;

for result in rdr.deserialize() { let user: User = result?; println!("Utilisateur : {} ({} ans) - {}", user.name, user.age, user.email); } Ok(())}


Écriture de données en CSV



Pour l'écriture, on utilise csv::Writer. Exemple d'écriture de données structurées :



use csv::Writer;use serde::Serialize;

#[derive(Debug, Serialize)]struct Product { id: u32, name: String, price: f64, in_stock: bool,}

fn main() -> Result<(), Box<dyn std::error::Error>> { let mut wtr = Writer::from_path("products.csv")?;

// Écriture des en-têtes wtr.write_record(&["id", "name", "price", "in_stock"])?;

// Écriture des données via sérialisation let products = vec![ Product { id: 1, name: "Ordinateur portable".into(), price: 75000.50, in_stock: true }, Product { id: 2, name: "Souris".into(), price: 1500.00, in_stock: false }, ];

for product in &products { wtr.serialize(product)?; }

wtr.flush()?; println!("Données écrites dans products.csv"); Ok(())}


Configuration des délimiteurs et des guillemets



La bibliothèque permet de configurer le format de manière flexible. Par exemple, pour TSV (tabulation comme délimiteur) :



let mut rdr = csv::ReaderBuilder::new()    .delimiter(b'\\t')    .flexible(true) // autoriser un nombre variable de champs    .quoting(false) // désactiver les guillemets    .from_reader(io::stdin());


Gestion des erreurs et des fichiers volumineux



Lors du travail avec de gros fichiers CSV, il est important de prendre en compte les performances. csv utilise une lecture tamponnée et ne charge pas

Recommendations