Работа с CSV в Swift (iOS/macOS): библиотека SwiftCSV и основы парсинга
CSV (Comma-Separated Values) — один из самых популярных форматов для хранения табличных данных. В экосистеме Apple (iOS, macOS) работа с CSV-файлами часто требуется для импорта данных из внешних источников, экспорта отчетов или загрузки конфигураций. В этой статье мы рассмотрим библиотеку SwiftCSV — легковесное и удобное решение для парсинга CSV в Swift, а также базовые примеры работы с этим форматом без сторонних зависимостей.
Что такое SwiftCSV?
SwiftCSV — это open-source библиотека для Swift, которая позволяет легко читать и обрабатывать CSV-файлы. Она поддерживает как строковый парсинг, так и работу с файлами, автоматически определяет разделители (запятая, табуляция, точка с запятой) и предоставляет удобный API для доступа к строкам, столбцам и отдельным ячейкам.
Основные возможности:
- Парсинг CSV из строки, Data или URL (локального или удаленного).
- Поддержка заголовков столбцов (первая строка как ключи).
- Работа с вложенными кавычками и экранированными символами.
- Возможность выбора разделителя (запятая, табуляция, пользовательский).
- Минимальное количество зависимостей (чистый Swift).
Установка SwiftCSV
Добавьте библиотеку через Swift Package Manager (SPM):
- В Xcode выберите
File → Add Packages.... - Вставьте URL репозитория:
https://github.com/swiftcsv/SwiftCSV.git. - Выберите версию (рекомендуется последняя стабильная).
- Добавьте пакет в ваш таргет.
Или добавьте в Package.swift:
dependencies: [
.package(url: "https://github.com/swiftcsv/SwiftCSV.git", from: "0.9.0")
]
Базовый пример: чтение CSV из строки
Допустим, у нас есть CSV-строка с данными о пользователях:
let csvString = """
name,age,city
Alice,30,New York
Bob,25,Los Angeles
Charlie,35,Chicago
"""
Парсим её с помощью SwiftCSV:
import SwiftCSV
do {
let csv = try CSV(string: csvString)
// Доступ к строкам как словарям (ключи — заголовки)
for row in csv.rows {
if let name = row["name"], let age = row["age"], let city = row["city"] {
print("\(name) (\(age) лет) живет в \(city)")
}
}
} catch {
print("Ошибка парсинга: \(error)")
}
Вывод:
Alice (30 лет) живет в New York
Bob (25 лет) живет в Los Angeles
Charlie (35 лет) живет в Chicago
Чтение CSV из файла (iOS/macOS)
Для загрузки CSV из локального файла (например, в папке Documents или из бандла):
import SwiftCSV
// Путь к файлу (например, в Documents)
let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("data.csv")
do {
let csv = try CSV(url: fileURL)
// Доступ к столбцам
let names = csv.columns["name"] ?? []
print("Все имена: \(names)")
} catch {
print("Ошибка: \(error)")
}
Для файла из бандла:
if let path = Bundle.main.path(forResource: "data", ofType: "csv") {
let url = URL(fileURLWithPath: path)
let csv = try CSV(url: url)
// Работа с данными
}
Кастомные разделители и настройки
Если ваш CSV использует табуляцию или точку с запятой, укажите разделитель явно:
// TSV (Tab-Separated Values)
let tsv = try CSV(string: "name\tage\nAlice\t30", delimiter: .tab)
// Разделитель — точка с запятой
let csvSemicolon = try CSV(string: "name;age\nAlice;30", delimiter: Character(";"))
Также можно отключить парсинг заголовков (первая строка будет обычной строкой):
let csvNoHeader = try CSV(string: "Alice,30", loadColumns: false)
// Доступ через csvNoHeader.rows — массив массивов строк
Обработка ошибок и экранирование
SwiftCSV