在 Swift (iOS/macOS) 中处理 CSV — 库与代码示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 Swift (iOS/macOS) 中处理 CSV:库、解析与示例



CSV(逗号分隔值)是交换表格数据最常用的格式之一。在 Apple 生态系统(iOS、macOS、watchOS)中,处理 CSV 通常用于数据导入/导出、加载配置或处理日志。在本文中,我们将探讨在 Swift 中处理 CSV 的主要方法:手动解析、流行的库(SwiftCSV 和 CodableCSV)以及带注释的代码示例。



1. 为什么应该使用 CSV 库?



标准 Foundation 库没有提供现成的 CSV 处理工具。手动解析(按逗号分割、处理引号、字符转义)很快就会变得繁琐且容易出错。库可以解决以下问题:

  • 正确处理引号和转义字符。
  • 支持不同的分隔符(逗号、制表符、分号)。
  • 流式读取大文件(无需完全加载到内存)。
  • 与 Codable 集成以实现自动反序列化。


2. SwiftCSV 库



SwiftCSV — 一个轻量级的 CSV 读写库。支持行、字典和嵌套数组。通过 Swift Package Manager 安装:

// Package.swiftdependencies: [    .package(url: "https://github.com/swiftcsv/SwiftCSV.git", from: "0.9.0")]


从文件读取 CSV 示例:

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))

// 按标题访问行for row in csv.rows { let name = row["name"] ?? "" let age = row["age"] ?? "" print("\\(name) is \\(age) years old")}

// 访问列let allNames = csv.columns["name"] ?? []print(allNames)


写入 CSV: 该库不提供内置的写入方法,但您可以手动构建字符串:

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. CodableCSV 库



CodableCSV — 一个功能强大的库,支持 Codable、自定义分隔符、流式读取和可配置编码。非常适合复杂项目。



安装:

// Package.swiftdependencies: [    .package(url: "https://github.com/dehesa/CodableCSV.git", from: "0.9.0")]


读取并自动反序列化为模型的示例:

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 // 第一行是标题 config.delimiter = .comma}let people = try decoder.decode([Person].self, from: data)

for person in people { print(person.name, person.age)}


使用 CodableCSV 写入 CSV:

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. 手动解析(不使用库)



如果项目较小并且您希望避免依赖,可以实现一个简单的解析器。

推荐