Trabajo con CSV en Swift (iOS/macOS): bibliotecas, análisis y ejemplos
CSV (Comma-Separated Values) es uno de los formatos más comunes para el intercambio de datos tabulares. En el ecosistema de Apple (iOS, macOS, watchOS), el trabajo con CSV a menudo se requiere para importar/exportar datos, cargar configuraciones o procesar registros. En este artículo, revisaremos los enfoques principales para trabajar con CSV en Swift: análisis manual, bibliotecas populares (SwiftCSV y CodableCSV) y ejemplos de código con explicaciones.
1. ¿Por qué usar bibliotecas para CSV?
La biblioteca estándar Foundation no proporciona herramientas listas para trabajar con CSV. El análisis manual (separación por comas, manejo de comillas, escape de caracteres) rápidamente se vuelve engorroso y propenso a errores. Las bibliotecas resuelven las siguientes tareas:
- Manejo correcto de comillas y caracteres escapados.
- Soporte para diferentes delimitadores (coma, tabulación, punto y coma).
- Lectura de archivos grandes en flujo (sin cargarlos completamente en memoria).
- Integración con Codable para deserialización automática.
2. Biblioteca SwiftCSV
SwiftCSV es una biblioteca ligera para leer y escribir CSV. Soporta líneas, diccionarios y arreglos anidados. Instalación a través de Swift Package Manager:
// Package.swiftdependencies: [ .package(url: "https://github.com/swiftcsv/SwiftCSV.git", from: "0.9.0")]Ejemplo de lectura de CSV desde un archivo:
import SwiftCSV
guard let path = Bundle.main.path(forResource: "data", ofType: "csv") else { fatalError("CSV file not found")}let csv = try CSV(url: URL(fileURLWithPath: path))
// Acceso a filas por encabezadosfor row in csv.rows { let name = row["name"] ?? "" let age = row["age"] ?? "" print("\\(name) is \\(age) years old")}
// Acceso a columnaslet allNames = csv.columns["name"] ?? []print(allNames) Escritura de CSV: la biblioteca no proporciona un método de escritura incorporado, pero puedes generar la cadena manualmente:
func writeCSV(rows: [[String: String]], headers: [String]) -> String { var csvString = headers.joined(separator: ",") + "" for row in rows { let values = headers.map { row[$0] ?? "" } csvString += values.joined(separator: ",") + "" } return csvString}
let csvData = writeCSV(rows: data, headers: ["name", "age"])try csvData.write(to: url, atomically: true, encoding: .utf8)3. Biblioteca CodableCSV
CodableCSV es una biblioteca potente que soporta Codable, delimitadores personalizados, lectura en flujo y codificación configurable. Ideal para proyectos complejos.
Instalación:
// Package.swiftdependencies: [ .package(url: "https://github.com/dehesa/CodableCSV.git", from: "0.9.0")]Ejemplo de lectura con deserialización automática a un modelo:
import CodableCSV
struct Person: Codable { let name: String let age: Int let email: String?}
let data = try Data(contentsOf: url)let decoder = CSVDecoder { config in config.headerStrategy = .firstLine // primera línea son encabezados config.delimiter = .comma}let people = try decoder.decode([Person].self, from: data)
for person in people { print(person.name, person.age)}Escritura de CSV con CodableCSV:
let encoder = CSVEncoder { config in config.headerStrategy = .firstLine config.delimiter = .comma}let data = try encoder.encode(people, into: Data.self)try data.write(to: url, options: .atomic)4. Análisis manual (sin bibliotecas)
Si el proyecto es pequeño y deseas evitar dependencias, puedes implementar un analizador simple. También en la biblioteca
Lottie para Swift: guía completa con ejemplos
Monitoreo de aplicaciones Java: herramientas y bibliotecas para la recopilación de métricas
Parseo de HTML en TypeScript: bibliotecas, herramientas y ejemplos
Generación de códigos QR en C++: biblioteca QR-Code-generator
FFmpeg Python: guía completa para procesar video en Python
Recommendations