Trabalhando com CSV em Swift (iOS/macOS): do simples ao complexo
CSV (Comma-Separated Values) é um dos formatos mais comuns para troca de dados tabulares. Ele é usado para exportação do Excel, Google Sheets, bancos de dados e logs simples. No ecossistema Swift (iOS, macOS, watchOS, tvOS) não há um módulo nativo para trabalhar com CSV, mas existem várias bibliotecas testadas que simplificam bastante esse processo. Neste artigo, vamos explorar as melhores ferramentas e escrever alguns exemplos de código.
Por que não escrever um parser CSV manualmente?
À primeira vista, o CSV parece simples: basta dividir a linha por vírgulas e pronto. No entanto, na prática surgem dificuldades:
- Os campos podem conter vírgulas internas (por exemplo,
"Smith, John"). - Os campos podem estar entre aspas, e dentro das aspas pode haver aspas escapadas (
""). - Sistemas diferentes usam delimitadores diferentes (vírgula, ponto e vírgula, tabulação).
- Problemas com codificações (UTF-8, UTF-16, Windows-1251).
Portanto, para código em produção, é altamente recomendável usar uma biblioteca pronta.
Melhores bibliotecas para CSV em Swift
1. SwiftCSV (de Naoto Kaneko)
Uma das bibliotecas mais populares e leves. Suporta leitura e escrita, lida automaticamente com aspas e escapamento. Funciona com Swift Package Manager (SPM) e CocoaPods.
// Conexão via SPM: .package(url: "https://github.com/naoty/SwiftCSV.git", from: "0.9.0")2. CodableCSV (de Dehesa)
Uma biblioteca moderna que se integra ao protocolo Codable. Permite fazer parsing de CSV diretamente para estruturas Swift. Ideal para projetos onde os dados têm tipagem estrita.
// Conexão: .package(url: "https://github.com/dehesa/CodableCSV.git", from: "0.6.0")3. CSwift
Uma biblioteca simples e rápida com uma API mínima. Adequada para projetos pequenos ou prototipagem rápida.
Exemplo 1: Leitura de CSV com SwiftCSV
Suponha que temos um arquivo users.csv:
id,name,email1,Ivan Ivanov,ivan@example.com2,Maria Petrova,maria@example.com3,John Doe,"john.doe@example.com"Código para leitura:
import SwiftCSV
guard let csvURL = Bundle.main.url(forResource: "users", withExtension: "csv") else { print("Arquivo não encontrado") return}
do { let csv = try CSV(url: csvURL) // Acesso às linhas como um array de dicionários for row in csv.rows { if let id = row["id"], let name = row["name"], let email = row["email"] { print("ID: \\(id), Nome: \\(name), Email: \\(email)") } } // Ou acesso por colunas print("Todos os nomes: \\(csv.columns["name"] ?? [])")} catch { print("Erro de parsing: \\(error)")}Exemplo 2: Escrita de CSV com SwiftCSV
import SwiftCSV
let headers = ["Nome", "Idade", "Cidade"]let rows = [ ["Ana", "28", "Moscou"], ["Boris", "35", "São Petersburgo"], ["Viktor", "22", "Novosibirsk"]]
do { let csv = try CSV(string: "", headers: headers, rows: rows) let csvString = csv.output // Obtém a string CSV print(csvString) // Salva em arquivo 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("Arquivo salvo: \\(fileURL)")} catch { print("Erro de escrita: \\(error)")}Exemplo 3: CodableCSV — parsing em estruturas
Este exemplo mostra como é fácil integrar CSV com modelos de dados:
import CodableCSV
struct User: Decodable { let id: Int let name: String let email: String}\ Também na biblioteca
Cache em PHP: Redis, Memcached e APCu — guia completo
Geração Swagger/OpenAPI para Swift: ferramentas e bibliotecas
Clikt: Poderoso framework CLI para Kotlin com sintaxe declarativa
Clap — um poderoso framework CLI para Rust
Framework CLI para Rust: Clap — ferramenta poderosa e conveniente para criar aplicações de console