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
Auch in der Bibliothek
Überwachung von C# (.NET)-Anwendungen mit AppMetrics
Kotlin Task Scheduler: Überblick und Anwendungsbeispiele
SMS-Versand mit TypeScript: API-Bibliotheken und Integration
Arbeit mit XML in Java: Bibliotheken und Werkzeuge für das Parsing