Biblioteca csv para trabajar con archivos CSV en Rust
CSV (Valores Separados por Comas) es uno de los formatos más comunes para almacenar datos tabulares. En Rust, para trabajar con CSV existe una biblioteca potente, flexible y de alto rendimiento llamada csv, que forma parte del ecosistema de BurntSushi (autor de ripgrep y regex). Permite leer, escribir, serializar y deserializar datos con un mínimo esfuerzo y máxima seguridad de tipos.
Instalación
Agregue la dependencia en Cargo.toml:
[dependencies]csv = "1.3"Para serialización/deserialización de estructuras también necesitará serde:
[dependencies]csv = "1.3"serde = { version = "1.0", features = ["derive"] }Funcionalidades principales de la biblioteca
- Lectura y escritura con delimitadores, comillas y caracteres de escape configurables.
- Procesamiento automático de encabezados — trabajo por nombres de columnas.
- Serialización/Deserialización mediante
serde— conversión de filas CSV a estructuras Rust fuertemente tipadas. - Manejo flexible de errores — ubicación de errores (número de fila, columna).
- Procesamiento en flujo — trabajo con archivos grandes sin cargar todo en memoria.
- Soporte para codificaciones no UTF-8 (a través de crates externos, por ejemplo
encoding).
Lectura de un archivo CSV
La forma más sencilla de leer un CSV es usar Reader y un iterador sobre los registros.
Ejemplo 1: Lectura sin encabezados
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(())}Ejemplo 2: Lectura con encabezados
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!("{} is {} years old from {}", record.0, record.1, record.2); } Ok(())}Uso de Serde para tipado estricto
La forma más conveniente es definir una estructura anotada con #[derive(Deserialize)].
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(())}Esto garantiza que los datos se convertirán automáticamente a los tipos deseados. Si, por ejemplo, en el campo age aparece la cadena "abc", el programa devolverá un error indicando la fila y la columna.
Escritura de un archivo CSV
Para escribir se utiliza Writer. Se pueden escribir tanto filas sin procesar como estructuras serializadas.
Ejemplo: escritura mediante estructura
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 También en la biblioteca
Generación de códigos QR en Java: biblioteca ZXing (guía detallada)
Aprendizaje automático: bibliotecas TypeScript para navegador y Node.js
Cliente OAuth para C++: biblioteca liboauth para autorización
Monitoreo de aplicaciones PHP: guía completa de herramientas y bibliotecas
Trabajo con CSV en Swift (iOS/macOS): bibliotecas y ejemplos