Travailler avec CSV en Swift (iOS/macOS) : bibliothèque SwiftCSV et bases du parsing
CSV (Comma-Separated Values) est l'un des formats les plus populaires pour stocker des données tabulaires. Dans l'écosystème Apple (iOS, macOS), travailler avec des fichiers CSV est souvent nécessaire pour importer des données depuis des sources externes, exporter des rapports ou charger des configurations. Dans cet article, nous examinerons la bibliothèque SwiftCSV — une solution légère et pratique pour le parsing CSV en Swift, ainsi que des exemples de base pour travailler avec ce format sans dépendances tierces.
Qu'est-ce que SwiftCSV ?
SwiftCSV est une bibliothèque open-source pour Swift qui permet de lire et traiter facilement des fichiers CSV. Elle prend en charge à la fois le parsing de chaînes et le travail avec des fichiers, détecte automatiquement les délimiteurs (virgule, tabulation, point-virgule) et fournit une API pratique pour accéder aux lignes, colonnes et cellules individuelles.
Fonctionnalités principales :
- Parsing CSV à partir d'une chaîne, de Data ou d'une URL (locale ou distante).
- Prise en charge des en-têtes de colonnes (première ligne comme clés).
- Gestion des guillemets imbriqués et des caractères échappés.
- Possibilité de choisir le délimiteur (virgule, tabulation, personnalisé).
- Nombre minimal de dépendances (Swift pur).
Installation de SwiftCSV
Ajoutez la bibliothèque via Swift Package Manager (SPM) :
- Dans Xcode, sélectionnez
File → Add Packages.... - Collez l'URL du dépôt :
https://github.com/swiftcsv/SwiftCSV.git. - Choisissez la version (la dernière stable est recommandée).
- Ajoutez le paquet à votre cible.
Ou ajoutez dans Package.swift :
dependencies: [ .package(url: "https://github.com/swiftcsv/SwiftCSV.git", from: "0.9.0")]Exemple de base : lecture CSV à partir d'une chaîne
Supposons que nous ayons une chaîne CSV avec des données utilisateur :
let csvString = """name,age,cityAlice,30,New YorkBob,25,Los AngelesCharlie,35,Chicago"""Nous la parsons avec SwiftCSV :
import SwiftCSV
do { let csv = try CSV(string: csvString) // Accès aux lignes sous forme de dictionnaires (clés = en-têtes) for row in csv.rows { if let name = row["name"], let age = row["age"], let city = row["city"] { print("\\(name) (\\(age) ans) vit à \\(city)") } }} catch { print("Erreur de parsing : \\(error)")}Sortie :
Alice (30 ans) vit à New YorkBob (25 ans) vit à Los AngelesCharlie (35 ans) vit à ChicagoLecture CSV à partir d'un fichier (iOS/macOS)
Pour charger un CSV depuis un fichier local (par exemple, dans le dossier Documents ou depuis le bundle) :
import SwiftCSV
// Chemin vers le fichier (ex. dans Documents)let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("data.csv")
do { let csv = try CSV(url: fileURL) // Accès aux colonnes let names = csv.columns["name"] ?? [] print("Tous les noms : \\(names)")} catch { print("Erreur : \\(error)")}Pour un fichier depuis le bundle :
if let path = Bundle.main.path(forResource: "data", ofType: "csv") { let url = URL(fileURLWithPath: path) let csv = try CSV(url: url) // Travail avec les données}Délimiteurs personnalisés et paramètres
Si votre CSV utilise la tabulation ou le point-virgule, spécifiez le délimiteur explicitement :
// TSV (Tab-Separated Values)let tsv = try CSV(string: "name\\tageAlice\\t30", delimiter: .tab)
// Délimiteur — point-virgulelet csvSemicolon = try CSV(string: "name;ageAlice;30", delimiter: Character(";"))Vous pouvez également désactiver le parsing des en-têtes (la première ligne sera une ligne normale) :
let csvNoHead