Arbeiten mit CSV in Rust: Die csv-Bibliothek und Datenverarbeitung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Arbeiten mit CSV in Rust: Die Bibliothek csv und praktische Beispiele



Das CSV-Format (Comma-Separated Values) bleibt eines der beliebtesten Verfahren zur Speicherung von Tabellendaten. In Rust gibt es für die Arbeit mit CSV die ausgereifte und leistungsstarke Bibliothek csv, die eine praktische API zum Lesen, Schreiben und Verarbeiten von Daten bietet. In diesem Artikel werden wir im Detail besprechen, wie man effizient mit CSV in Rust arbeitet.



Installation und Einbindung der Bibliothek



Fügen Sie zunächst die Abhängigkeit in die Datei Cargo.toml ein:



[dependencies]csv = "1.3"


Die Bibliothek csv unterstützt die Arbeit mit Kodierungen, anpassbaren Trennzeichen und Anführungszeichen und bietet die Möglichkeit der Serialisierung/Deserialisierung von Daten über die serde-Traits.



Lesen einer CSV-Datei



Der einfachste Weg, eine CSV-Datei zu lesen, ist die Verwendung von csv::Reader. Betrachten wir ein Beispiel mit der Datei users.csv:



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

fn main() -> Result<(), Box<dyn Error>> { // Erstellen eines Readers mit Einstellungen let mut rdr = ReaderBuilder::new() .has_headers(true) // erste Zeile sind Kopfzeilen .delimiter(b',') // Trennzeichen ist das Komma .from_path("users.csv")?;

// Ausgabe der Kopfzeilen let headers = rdr.headers()?; println!("Headers: {:?}", headers);

// Iterieren über die Datensätze for result in rdr.records() { let record = result?; println!("{:?}", record); } Ok(())}


Verarbeitung von Datensätzen mit Deserialisierung



Für die Arbeit mit strukturierten Daten ist die Deserialisierung in benutzerdefinierte Strukturen praktisch. Binden Sie serde und serde_derive ein:



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


Jetzt können Sie eine Struktur definieren und Daten direkt lesen:



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!("Benutzer: {} ({} Jahre) - {}", user.name, user.age, user.email); } Ok(())}


Schreiben von Daten in CSV



Zum Schreiben wird csv::Writer verwendet. Beispiel zum Schreiben strukturierter Daten:



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")?;

// Schreiben der Kopfzeilen wtr.write_record(&["id", "name", "price", "in_stock"])?;

// Schreiben der Daten mittels Serialisierung let products = vec![ Product { id: 1, name: "Laptop".into(), price: 75000.50, in_stock: true }, Product { id: 2, name: "Maus".into(), price: 1500.00, in_stock: false }, ];

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

wtr.flush()?; println!("Daten wurden in products.csv geschrieben"); Ok(())}


Anpassung von Trennzeichen und Anführungszeichen



Die Bibliothek ermöglicht eine flexible Anpassung des Formats. Zum Beispiel für TSV (Tabulator als Trennzeichen):



let mut rdr = csv::ReaderBuilder::new()    .delimiter(b'\\t')    .flexible(true) // unterschiedliche Anzahl von Feldern erlauben    .quoting(false) // Anführungszeichen deaktivieren    .from_reader(io::stdin());


Fehlerbehandlung und große Dateien



Bei der Arbeit mit großen CSV-Dateien ist die Leistung zu beachten. csv verwendet gepuffertes Lesen und lädt nicht

Empfehlungen