Arbeit mit CSV in Swift (iOS/macOS): vom Einfachen zum Komplexen
CSV (Comma-Separated Values) ist eines der am weitesten verbreiteten Formate für den Austausch von Tabellendaten. Es wird für den Export aus Excel, Google Sheets, Datenbanken und einfachen Logs verwendet. Im Swift-Ökosystem (iOS, macOS, watchOS, tvOS) gibt es kein integriertes Modul für die Arbeit mit CSV, aber es gibt mehrere bewährte Bibliotheken, die diesen Prozess erheblich vereinfachen. In diesem Artikel betrachten wir die besten Werkzeuge und schreiben einige Codebeispiele.
Warum sollte man keinen CSV-Parser selbst schreiben?
Auf den ersten Blick erscheint CSV einfach: Zeile durch Kommas trennen – und fertig. In der Praxis treten jedoch Schwierigkeiten auf:
- Felder können Kommas enthalten (z.B.
"Smith, John"). - Felder können in Anführungszeichen eingeschlossen sein, und innerhalb der Anführungszeichen können escaped Anführungszeichen vorkommen (
""). - Verschiedene Systeme verwenden unterschiedliche Trennzeichen (Komma, Semikolon, Tabulator).
- Probleme mit Kodierungen (UTF-8, UTF-16, Windows-1251).
Daher wird für Produktionscode dringend empfohlen, eine fertige Bibliothek zu verwenden.
Beste Bibliotheken für CSV in Swift
1. SwiftCSV (von Naoto Kaneko)
Eine der beliebtesten und leichtesten Bibliotheken. Unterstützt Lesen und Schreiben, verarbeitet automatisch Anführungszeichen und Escaping. Funktioniert über Swift Package Manager (SPM) und CocoaPods.
// Einbindung über SPM: .package(url: "https://github.com/naoty/SwiftCSV.git", from: "0.9.0")2. CodableCSV (von Dehesa)
Eine moderne Bibliothek, die sich in das Codable-Protokoll integriert. Ermöglicht das direkte Parsen von CSV in Swift-Strukturen. Ideal für Projekte, bei denen Daten streng typisiert sind.
// Einbindung: .package(url: "https://github.com/dehesa/CodableCSV.git", from: "0.6.0")3. CSwift
Eine einfache und schnelle Bibliothek mit minimaler API. Gut geeignet für kleine Projekte oder schnelles Prototyping.
Beispiel 1: CSV lesen mit SwiftCSV
Angenommen, wir haben eine Datei users.csv:
id,name,email1,Ivan Ivanov,ivan@example.com2,Maria Petrova,maria@example.com3,John Doe,"john.doe@example.com"Code zum Lesen:
import SwiftCSV
guard let csvURL = Bundle.main.url(forResource: "users", withExtension: "csv") else { print("Datei nicht gefunden") return}
do { let csv = try CSV(url: csvURL) // Zugriff auf Zeilen als Array von Wörterbüchern for row in csv.rows { if let id = row["id"], let name = row["name"], let email = row["email"] { print("ID: \\(id), Name: \\(name), Email: \\(email)") } } // Oder Zugriff über Spalten print("Alle Namen: \\(csv.columns["name"] ?? [])")} catch { print("Parsing-Fehler: \\(error)")}Beispiel 2: CSV schreiben mit SwiftCSV
import SwiftCSV
let headers = ["Name", "Alter", "Stadt"]let rows = [ ["Anna", "28", "Moskau"], ["Boris", "35", "Sankt Petersburg"], ["Viktor", "22", "Nowosibirsk"]]
do { let csv = try CSV(string: "", headers: headers, rows: rows) let csvString = csv.output // CSV-String erhalten print(csvString) // In Datei speichern let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] let fileURL = documentsPath.appendingPathComponent("output.csv") try csvString.write(to: fileURL, atomically: true, encoding: .utf8) print("Datei gespeichert: \\(fileURL)")} catch { print("Schreibfehler: \\(error)")}Beispiel 3: CodableCSV — Parsen in Strukturen
Dieses Beispiel zeigt, wie einfach CSV mit Datenmodellen integriert werden kann:
import CodableCSV
struct User: Decodable { let id: Int let name: String let email: String}\ Auch in der Bibliothek
Geolokalisierung und Karten in Kotlin: Vollständiger Leitfaden zur Integration
Standard-Java-Bibliothek: vollständiger Überblick und Codebeispiele
Kysely TypeScript: Vollständiges Tutorial mit Codebeispielen
Maschinelles Lernen mit PHP: Überblick über Bibliotheken zur ML-Integration
Rate Limiting in Rust: Bibliotheken zur Begrenzung der Anfragefrequenz