Trabalhando com CSV em Swift (iOS/macOS): bibliotecas, análise e exemplos
CSV (Comma-Separated Values) — um dos formatos mais comuns para troca de dados tabulares. No ecossistema Apple (iOS, macOS, watchOS), trabalhar com CSV é frequentemente necessário para importação/exportação de dados, carregamento de configurações ou processamento de logs. Neste artigo, abordaremos as principais abordagens para trabalhar com CSV em Swift: análise manual, bibliotecas populares (SwiftCSV e CodableCSV) e exemplos de código com explicações.
1. Por que usar bibliotecas para CSV?
A biblioteca padrão Foundation não fornece ferramentas prontas para trabalhar com CSV. A análise manual (separação por vírgulas, tratamento de aspas, escape de caracteres) rapidamente se torna complicada e propensa a erros. As bibliotecas resolvem os seguintes problemas:
- Tratamento correto de aspas e caracteres escapados.
- Suporte a diferentes delimitadores (vírgula, tabulação, ponto e vírgula).
- Leitura de arquivos grandes de forma contínua (sem carregar tudo na memória).
- Integração com Codable para desserialização automática.
2. Biblioteca SwiftCSV
SwiftCSV — uma biblioteca leve para leitura e escrita de CSV. Suporta linhas, dicionários e arrays aninhados. Instalação via Swift Package Manager:
// Package.swiftdependencies: [ .package(url: "https://github.com/swiftcsv/SwiftCSV.git", from: "0.9.0")]Exemplo de leitura de CSV de um arquivo:
import SwiftCSV
guard let path = Bundle.main.path(forResource: "data", ofType: "csv") else { fatalError("CSV file not found")}let csv = try CSV(url: URL(fileURLWithPath: path))
// Acesso às linhas pelos cabeçalhosfor row in csv.rows { let name = row["name"] ?? "" let age = row["age"] ?? "" print("\\(name) is \\(age) years old")}
// Acesso às colunaslet allNames = csv.columns["name"] ?? []print(allNames) Escrita de CSV: a biblioteca não fornece um método de escrita embutido, mas você pode formar a string manualmente:
func writeCSV(rows: [[String: String]], headers: [String]) -> String { var csvString = headers.joined(separator: ",") + "" for row in rows { let values = headers.map { row[$0] ?? "" } csvString += values.joined(separator: ",") + "" } return csvString}
let csvData = writeCSV(rows: data, headers: ["name", "age"])try csvData.write(to: url, atomically: true, encoding: .utf8)3. Biblioteca CodableCSV
CodableCSV — uma biblioteca poderosa que suporta Codable, delimitadores personalizados, leitura contínua e codificação configurável. Ideal para projetos complexos.
Instalação:
// Package.swiftdependencies: [ .package(url: "https://github.com/dehesa/CodableCSV.git", from: "0.9.0")]Exemplo de leitura com desserialização automática para um modelo:
import CodableCSV
struct Person: Codable { let name: String let age: Int let email: String?}
let data = try Data(contentsOf: url)let decoder = CSVDecoder { config in config.headerStrategy = .firstLine // primeira linha — cabeçalhos config.delimiter = .comma}let people = try decoder.decode([Person].self, from: data)
for person in people { print(person.name, person.age)}Escrita de CSV com CodableCSV:
let encoder = CSVEncoder { config in config.headerStrategy = .firstLine config.delimiter = .comma}let data = try encoder.encode(people, into: Data.self)try data.write(to: url, options: .atomic)4. Análise manual (sem bibliotecas)
Se o projeto for pequeno e você quiser evitar dependências, é possível implementar um analisador simples. Também na biblioteca
Zod — poderosa biblioteca para validação de dados em TypeScript
Envio de email em Swift (iOS/macOS): MFMailComposeViewController e SMTP
Cliente HTTP para JavaScript (Node.js): principais bibliotecas
Dataset Python: trabalhe com bancos de dados como no Pandas
Eigen para C++: guia completo com exemplos
Recommendations