Trabajo con CSV en Rust: biblioteca csv y ejemplos prácticos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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

Recommendations