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

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

Die Bibliothek csv für die Arbeit mit CSV-Dateien in Rust



CSV (Comma-Separated Values) ist eines der am weitesten verbreiteten Formate zur Speicherung von Tabellendaten. In Rust gibt es für die Arbeit mit CSV eine leistungsstarke, flexible und performante Bibliothek namens csv, die Teil des BurntSushi-Ökosystems ist (Autor von ripgrep und regex). Sie ermöglicht das Lesen, Schreiben, Serialisieren und Deserialisieren von Daten mit minimalem Aufwand und maximaler Typsicherheit.



Installation

Fügen Sie die Abhängigkeit in Cargo.toml hinzu:

[dependencies]csv = "1.3"


Für die Serialisierung/Deserialisierung von Strukturen wird außerdem serde benötigt:

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


Hauptfunktionen der Bibliothek

  • Lesen und Schreiben mit konfigurierbaren Trennzeichen, Anführungszeichen und Escape-Zeichen.
  • Automatische Verarbeitung von Kopfzeilen — Arbeit nach Spaltennamen.
  • Serialisierung/Deserialisierung über serde — Umwandlung von CSV-Zeilen in streng typisierte Rust-Strukturen.
  • Flexible Fehlerbehandlung — Fehlerpositionierung (Zeilennummer, Spalte).
  • Streaming-Verarbeitung — Arbeit mit großen Dateien ohne vollständiges Laden in den Speicher.
  • Unterstützung von Nicht-UTF8-Kodierungen (über externe Crates, z. B. encoding).


CSV-Datei lesen

Der einfachste Weg, CSV zu lesen, ist die Verwendung von Reader und einem Iterator über die Datensätze.



Beispiel 1: Lesen ohne Kopfzeilen

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

fn read_csv_no_headers() -> Result<(), Box<dyn Error>> { let data = "name,age,cityAlice,30,LondonBob,25,Paris"; let mut reader = ReaderBuilder::new() .has_headers(false) .from_reader(data.as_bytes());

for result in reader.records() { let record = result?; println!("{:?}", record); } Ok(())}


Beispiel 2: Lesen mit Kopfzeilen

use csv::Reader;use std::error::Error;

fn read_csv_with_headers() -> Result<(), Box<dyn Error>> { let data = "name,age,cityAlice,30,LondonBob,25,Paris"; let mut reader = Reader::from_reader(data.as_bytes());

for result in reader.deserialize() { let record: (String, u32, String) = result?; println!("{} ist {} Jahre alt aus {}", record.0, record.1, record.2); } Ok(())}


Verwendung von Serde für strenge Typisierung

Der bequemste Weg ist die Definition einer Struktur, die mit #[derive(Deserialize)] annotiert ist.



use serde::Deserialize;use csv::Reader;use std::error::Error;

#[derive(Debug, Deserialize)]struct Person { name: String, age: u32, city: String,}

fn read_typed_csv() -> Result<(), Box<dyn Error>> { let data = "name,age,cityAlice,30,LondonBob,25,Paris"; let mut reader = Reader::from_reader(data.as_bytes());

for result in reader.deserialize() { let person: Person = result?; println!("{:?}", person); } Ok(())}


Dies stellt sicher, dass die Daten automatisch in die erforderlichen Typen umgewandelt werden. Wenn beispielsweise in das Feld age die Zeichenkette "abc" gelangt, gibt das Programm einen Fehler mit Angabe von Zeile und Spalte zurück.



CSV-Datei schreiben

Zum Schreiben wird Writer verwendet. Es können sowohl rohe Zeichenketten als auch serialisierte Strukturen geschrieben werden.



Beispiel: Schreiben über eine Struktur

use serde::Serialize;use csv::Writer;use std::error::Error;

#[derive(Debug, Serialize)]struct Person { name: String, age: u32, city: String,}

fn write_csv() -> Result<(), Box<dyn

Empfehlungen