Trabajo con CSV en Swift (iOS/macOS): librería SwiftCSV y fundamentos de parsing
CSV (Comma-Separated Values) es uno de los formatos más populares para almacenar datos tabulares. En el ecosistema de Apple (iOS, macOS), el trabajo con archivos CSV a menudo es necesario para importar datos de fuentes externas, exportar informes o cargar configuraciones. En este artículo, exploraremos la librería SwiftCSV, una solución ligera y conveniente para el parsing de CSV en Swift, así como ejemplos básicos de trabajo con este formato sin dependencias externas.
¿Qué es SwiftCSV?
SwiftCSV es una librería open-source para Swift que permite leer y procesar archivos CSV fácilmente. Soporta tanto el parsing de cadenas como el trabajo con archivos, detecta automáticamente los delimitadores (coma, tabulación, punto y coma) y proporciona una API conveniente para acceder a filas, columnas y celdas individuales.
Características principales:
- Parsing de CSV desde una cadena, Data o URL (local o remota).
- Soporte para encabezados de columna (primera fila como claves).
- Manejo de comillas anidadas y caracteres escapados.
- Posibilidad de elegir el delimitador (coma, tabulación, personalizado).
- Mínimo número de dependencias (Swift puro).
Instalación de SwiftCSV
Agregue la librería a través de Swift Package Manager (SPM):
- En Xcode, seleccione
File → Add Packages.... - Pegue la URL del repositorio:
https://github.com/swiftcsv/SwiftCSV.git. - Seleccione la versión (se recomienda la última estable).
- Agregue el paquete a su target.
O agréguelo en Package.swift:
dependencies: [ .package(url: "https://github.com/swiftcsv/SwiftCSV.git", from: "0.9.0")]Ejemplo básico: lectura de CSV desde una cadena
Supongamos que tenemos una cadena CSV con datos de usuarios:
let csvString = """name,age,cityAlice,30,New YorkBob,25,Los AngelesCharlie,35,Chicago"""La parseamos con SwiftCSV:
import SwiftCSV
do { let csv = try CSV(string: csvString) // Acceso a filas como diccionarios (claves = encabezados) for row in csv.rows { if let name = row["name"], let age = row["age"], let city = row["city"] { print("\\(name) (\\(age) años) vive en \\(city)") } }} catch { print("Error de parsing: \\(error)")}Salida:
Alice (30 años) vive en New YorkBob (25 años) vive en Los AngelesCharlie (35 años) vive en ChicagoLectura de CSV desde un archivo (iOS/macOS)
Para cargar un CSV desde un archivo local (por ejemplo, en la carpeta Documents o desde el bundle):
import SwiftCSV
// Ruta al archivo (por ejemplo, en Documents)let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("data.csv")
do { let csv = try CSV(url: fileURL) // Acceso a columnas let names = csv.columns["name"] ?? [] print("Todos los nombres: \\(names)")} catch { print("Error: \\(error)")}Para un archivo del bundle:
if let path = Bundle.main.path(forResource: "data", ofType: "csv") { let url = URL(fileURLWithPath: path) let csv = try CSV(url: url) // Trabajo con datos}Delimitadores personalizados y configuración
Si su CSV usa tabulaciones o punto y coma, especifique el delimitador explícitamente:
// TSV (Tab-Separated Values)let tsv = try CSV(string: "name\\tageAlice\\t30", delimiter: .tab)
// Delimitador: punto y comalet csvSemicolon = try CSV(string: "name;ageAlice;30", delimiter: Character(";"))También puede desactivar el parsing de encabezados (la primera fila será una fila normal):
let csvNoHead