一个 Swift 包,用于创建 CSV 文件。
Swift 语言和苹果的应用库都没有将数据转换为 CSV 格式以供导出的标准化方法。已经存在许多软件包,但我想要构建自己的最小化、可重用的库。
我开始构建这个库时,是想要寻找一个功能集非常小的库。
不耦合到根对象结构。
Codable
很棒,但仅限于每个对象的单一编码表示。它的创建也考虑到了层级表示——字典和数组嵌套在其他字典或数组中——而 CSV 本质上是扁平结构。
我还需要用于不同目的的具有不同列的 CSV 输出,但这些输出可能各自使用不同的列来序列化相同的对象。因此,SwiftCSVEncoder 提供了 CSVTable
对象,用于定义要使用的列。
let table: CSVTable<Customer> = CSVTable(
columns: [
CSVColumn("Name") { $0.name },
CSVColumn("Email") { $0.email },
CSVColumn("Order count") { $0.orders?.count ?? 0 }
]
)
如果列的属性块除了访问属性之外什么都不做,则可以使用基于 keyPath 的快捷方式。
CSVColumn("Name", \.name)
始终将列标题作为第一行包含在内。
字符串的自动引用,但仅在需要时。
在 CSV 中包含自由格式文本充满了困难,因为并非所有的 CSV 导入器都以相同的方式处理换行符或嵌入的特殊字符("
,,
)等内容。SwiftCSVEncoder 目前仅支持一组字符串编码规则。
,
)、换行符(\n
)或双引号("
),或者如果它具有前导或尾随空格,则整个字符串将用双引号括起来。This is C.S.Lewis's sequel to "The Lion, The Witch and the Wardrobe"
将被输出为 "This is C.S.Lewis's sequel to ""The Lion, The Witch and the Wardrobe"""
。默认分隔符和行尾符
SwiftCSVEncoder 发出的 CSV 仅使用逗号分隔字段。每行都以 \r\n
字符结尾。如果需要不同的选项,那么(目前)请在其他地方寻找。
可选的 Date
格式控制
Date
对象被原生处理,但它们转换为字符串的格式可能会有所不同。每个 CSVTable
都支持一个配置对象,其中包括 dateEncodingStrategy
。默认是使用完整的日期/时间 ISO 8601 兼容格式。
仅支持内存中数据创建
SwiftCSVEncoder
仅在内存中创建整个 CSV 文件的字符串表示形式。调用应用程序需要处理将数据保存到适当位置。
随着 SwiftCSVEncoder
的发展,我预计它会获得比上述更多的功能。但其理念将始终是尽可能保持简单。