DialectalCSV (csv-dialect-swift)

Build Status Coverage Status

一个用 Swift 编写的多方言 CSV 解析器,用于导入和导出美味的逗号分隔值文档。 该库实现了 Frictionless Data 的 CSV 方言规范,该规范承认 CSV RFC 4180 具有追溯性,并且在实践中存在大量文档和导出器的变体。 该库还支持数据增量流式传输,以实现低峰值内存占用。

DialectalCSV 提供了一个分层接口来处理 CSV。 在其最低级别是一对能够流式传输部分数据的解析器。 更高级别的接口可用于使用 FileHandle 进行数据流式传输的文件 URL。 并且便利类 Document 允许处理内存中的表示形式。

该库由一小部分单元测试提供支持,这些测试为回归测试提供了基础。

要求

功能状态

CSV 方言属性 状态
分隔符 可用
行终止符 可用
引号字符 可用
双引号 可用
转义字符 可用
空序列 可用
跳过初始空格 可用
标题 可用
注释字符 不可用
区分大小写的标题 不适用

此实现与 csvddfVersion 1.2 兼容。

用法

有关其他示例,请查看测试用例并查阅界面文档,包括可能抛出的错误情况。

在内存中打开 CSV 文档

从内存数据中打开一个制表符分隔值 (TSV) 文件

import DialectalCSV

var dialect = Dialect()
dialect.delimiter = "\t"
dialect.header = false
let document = try Document(data: data, dialect: dialect)

创建 CSV 文档

从 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 文档

将 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 不是一个选项,可以使用其他方法。

通过 Swift Package Manager 的 Xcode(推荐)

在 Xcode 11 中,Swift Package Manager 现在已集成到 Xcode 中。 像添加任何其他 Swift 包一样添加此包。

直到 Xcode 11.2 左右,此方法才可靠。 虽然可以生成 xcodeproj,但对于旧版本的 Xcode 没有 xcodeproj。 请参阅 Xcode 子项目选项。

手动 Swift Package Manager(推荐)

将以下依赖项添加到你的 Package.swiftdependencies 中,并使用 DialectalCSV 作为依赖项的名称。 你可能希望更改分支或使用特定的修订版。

.package(url: "git@github.com:chrispomeroyhale/csv-dialect-swift.git", .branch("main"))

Carthage(不推荐)

虽然 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

Xcode 子项目(不推荐)

使用此选项,首先使用外部工具(例如 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