CSVData

一个 Swift 软件包,用于使用枚举类型格式读取和写入 CSV。

特性

用法

行格式定义

导入和导出依赖于自定义的格式枚举,该枚举实现了 CSVFormat 协议。此格式应与您要导入或导出的 CSV 行格式相对应。

private enum TestShoppingItem: String, CSVFormat {
    case id
    case name
    case price

    var title: String {
        rawValue.capitalized
    }
}

导入

要读取 CSV 字符串或文件,请使用 CSV 字符串或 url 以及先前定义的 CSVFormat 枚举初始化 CSVData 对象。 行和列的分隔符会自动猜测,但您也可以手动设置 rowSeparatorcolumnSeparator 属性。

func read() throws {
    // read CSV string
    let testCSVString = "id,name,Price\n1,Bananas,1.20\n2,Sugar,2.30\n3,Milk,1.99"
    var csvData = try CSVData<TestShoppingItem>(csvString: testCSVString)

    // read CSV file on disk
    let documentsFolder = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    let csvUrl = documentsFolder.appending(path: "testCSV.csv")
    csvData = try CSVData<TestShoppingItem>(url: csvUrl)
}

初始化和操作

要使用您自己的数据初始化 CSVData 对象,请使用任何类型数据的数组调用初始化程序。 提供一个闭包作为数据源来初始化所有列中每个列的值。

func createCSVData() -> CSVData<TestShoppingItem> {
    let csvData = CSVData<TestShoppingItem>(items: Array(0 ..< 10)) { index, column in
        switch column {
        case .id:
            return "\(index)"
        case .name:
            return "Item \(index + 1)"
        case .price:
            return "\(Double(index) * 1.5)"
        }
    }
    
    return csvData
}

您可以在以后以类型安全的方式操作 csv 数据对象。

func manipulateCSVData() {
    let csvData = createCSVData()
    csvData[1][.name] = "Test"
}

导出

可以将 CSVData 导出到字符串。 使用 columnConfiguration 参数,您可以手动选择要导出的列。

func export() {
    let csvData = createCSVData()
    
    // export complete CSV string
    let csvString = csvData.csvString()
    
    // export only name column
    let csvStringOnlyName = csvData.csvString(columnConfiguration: .includeOnly(columns: [.name]))
            
    // export all columns but price
    let csvStringAllButPrice = csvData.csvString(columnConfiguration: .allBut(columns: [.price]))
}

安装

该库可以与 XCode 中的 Swift Package Manager 一起使用,也可以手动添加为包依赖项。