在Swift(iOS/macOS)中处理CSV:SwiftCSV库与解析基础

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

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

开始课程

在Swift(iOS/macOS)中处理CSV:SwiftCSV库与解析基础



CSV(逗号分隔值)是最流行的表格数据存储格式之一。在Apple生态系统(iOS、macOS)中,处理CSV文件通常用于从外部源导入数据、导出报告或加载配置。本文将介绍SwiftCSV库——一个轻量级且便捷的Swift CSV解析解决方案,以及无需第三方依赖即可处理该格式的基本示例。



什么是SwiftCSV?



SwiftCSV是一个开源的Swift库,可以轻松读取和处理CSV文件。它支持字符串解析和文件处理,自动检测分隔符(逗号、制表符、分号),并提供便捷的API来访问行、列和单个单元格。



主要功能:

  • 从字符串、Data或URL(本地或远程)解析CSV。
  • 支持列标题(第一行作为键)。
  • 处理嵌套引号和转义字符。
  • 可选择分隔符(逗号、制表符、自定义)。
  • 最少的依赖项(纯Swift)。


安装SwiftCSV



通过Swift Package Manager(SPM)添加库:

  1. 在Xcode中选择File → Add Packages...。
  2. 粘贴仓库URL:https://github.com/swiftcsv/SwiftCSV.git。
  3. 选择版本(建议使用最新稳定版)。
  4. 将包添加到您的目标中。


或者在Package.swift中添加:

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


基本示例:从字符串读取CSV



假设我们有一个包含用户数据的CSV字符串:

let csvString = """name,age,cityAlice,30,New YorkBob,25,Los AngelesCharlie,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 YorkBob (25岁) 住在 Los AngelesCharlie (35岁) 住在 Chicago


从文件读取CSV(iOS/macOS)



从本地文件加载CSV(例如,在Documents文件夹或bundle中):

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


从bundle中读取文件:

if let path = Bundle.main.path(forResource: "data", ofType: "csv") {    let url = URL(fileURLWithPath: path)    let csv = try CSV(url: url)    // 处理数据}


自定义分隔符和设置



如果您的CSV使用制表符或分号,请明确指定分隔符:

// TSV(制表符分隔值)let tsv = try CSV(string: "name\\tageAlice\\t30", delimiter: .tab)

// 分隔符为分号let csvSemicolon = try CSV(string: "name;ageAlice;30", delimiter: Character(";"))


也可以禁用标题解析(第一行将作为普通行):

let csvNoHead                    

推荐