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 Auch in der Bibliothek
SMS-Versand mit PHP: API-Bibliotheken von sms.ru und anderen Diensten
PDF-Generierung in Java: Überblick über die besten Bibliotheken (iText, Apache PDFBox, OpenPDF)
Arbeiten mit Excel in Swift auf iOS und macOS: Bibliotheken und Beispiele
Kryptographie in C++: Vollständiger Leitfaden zu Verschlüsselung und Hashing
ndarray für Rust: Vollständige Anleitung mit Beispielen