一个用 Swift 编写的多方言 CSV 解析器,用于导入和导出美味的逗号分隔值文档。 该库实现了 Frictionless Data 的 CSV 方言规范,该规范承认 CSV RFC 4180 具有追溯性,并且在实践中存在大量文档和导出器的变体。 该库还支持数据增量流式传输,以实现低峰值内存占用。
DialectalCSV 提供了一个分层接口来处理 CSV。 在其最低级别是一对能够流式传输部分数据的解析器。 更高级别的接口可用于使用 FileHandle
进行数据流式传输的文件 URL。 并且便利类 Document
允许处理内存中的表示形式。
该库由一小部分单元测试提供支持,这些测试为回归测试提供了基础。
Foundation
和 Swift 标准库 APIswift-corelibs-foundation
中 Scanner
的实现不完整,因此不支持 LinuxCSV 方言属性 | 状态 |
---|---|
分隔符 | 可用 |
行终止符 | 可用 |
引号字符 | 可用 |
双引号 | 可用 |
转义字符 | 可用 |
空序列 | 可用 |
跳过初始空格 | 可用 |
标题 | 可用 |
注释字符 | 不可用 |
区分大小写的标题 | 不适用 |
此实现与 csvddfVersion
1.2 兼容。
有关其他示例,请查看测试用例并查阅界面文档,包括可能抛出的错误情况。
从内存数据中打开一个制表符分隔值 (TSV) 文件
import DialectalCSV
var dialect = Dialect()
dialect.delimiter = "\t"
dialect.header = false
let document = try Document(data: data, dialect: dialect)
从 Foundation 对象创建一个 CSV 文档,并为 nil 值设置自定义空序列模式。
import DialectalCSV
let headerAndRows = [ ["name", "nickname"], ["Nelson Mandela", "Madiba"] ]
let document = Document(allRows: headerAndRows)
document.records.append(["Mahatma Gandhi", nil])
let outputFileHandle = try FileHandle(forWritingTo: outputURL)
var dialect = Dialect()
dialect.nullSequence = "n/a"
try document.export(fileHandle: outputFileHandle, dialect: dialect)
将 CSV 文档转换为制表符分隔值 (TSV)。 将其流式传输到默认字节长度的缓冲区中,而不是一次性将其全部加载到内存中。
import DialectalCSV
FileManager.default.createFile(atPath: outputURL.path, contents: nil)
let outputFileHandle = try FileHandle(forWritingTo: outputURL)
var outputDialect = Dialect()
outputDialect.delimiter = "\t"
let outputHandler = OutputHandler(fileHandle: outputFileHandle, dialect: outputDialect)
let inputFileHandle = try FileHandle(forReadingFrom: inputURL)
let inputHandler = InputHandler(fileHandle: inputFileHandle, dialect: inputDialect)
inputHandler.delegate = outputHandler
try inputHandler.readToEndOfFile()
此项目旨在通过 Swift Package Manager 分发。 如果 SPM 不是一个选项,可以使用其他方法。
在 Xcode 11 中,Swift Package Manager 现在已集成到 Xcode 中。 像添加任何其他 Swift 包一样添加此包。
直到 Xcode 11.2 左右,此方法才可靠。 虽然可以生成 xcodeproj,但对于旧版本的 Xcode 没有 xcodeproj。 请参阅 Xcode 子项目选项。
将以下依赖项添加到你的 Package.swift
的 dependencies
中,并使用 DialectalCSV
作为依赖项的名称。 你可能希望更改分支或使用特定的修订版。
.package(url: "git@github.com:chrispomeroyhale/csv-dialect-swift.git", .branch("main"))
虽然 Carthage 官方不支持 Swift Package Manager,但可以手动集成它。 创建一个“运行脚本”阶段,并将其放置在“编译源”阶段之前,以自动执行更新、生成 Xcode 项目和构建依赖项。 运行脚本后,按照 Carthage 的文档将依赖项集成到你的项目中。
carthage update --no-build
pushd "Carthage/Checkouts/csv-dialect-swift"
swift package generate-xcodeproj --xcconfig-overrides ./Configuration.xcconfig
popd
carthage build --cache-builds
使用此选项,首先使用外部工具(例如 git 子模块)设置此库以管理依赖项,或者直接提交库的源代码。 然后使用以下命令生成 Xcode 项目:
swift package generate-xcodeproj --xcconfig-overrides ./Configuration.xcconfig
将生成的 Xcode 项目添加为子项目,并配置你的项目以使用 DialectalCSV
目标依赖项以及手动集成库的所有传统步骤。
你可以选择添加一个为你生成 Xcode 项目的“运行脚本”阶段,例如:
pushd "Vendors/DialectalCSV"
if [ ! -f ./csv-dialect-swift.xcodeproj/project.pbxproj ]; then
swift package generate-xcodeproj --xcconfig-overrides ./Configuration.xcconfig
else
echo "Skipping Xcode project generation for 'DialectalCSV'."
fi
popd
请注意,此解决方案的缺点是你仍然需要在升级之间删除生成的 Xcode 项目,这可能会导致人为错误,例如切换使用不同版本的库的分支时。
在 3-clause BSD 许可下授权。 请参阅 License.txt
。