当前位置: 首页 > 工具软件 > CSV.swift > 使用案例 >

SwiftCSV读取CSV数据及初步封装

於彬
2023-12-01

最近在做一个游戏助手类App,前期数据量较小,朋友帮忙抓取了一下装备数据存在CSV文件中,这里简单介绍一下SwiftCSV的安装使用及简单封装

安装

我们这里使用Cocoapods安装

target 'Tk300HeroAssistant' do
    pod 'SwiftCSV'

读入CSV文件

首先我们要读入CSV文件,创建一个CSV对象
首先我们从字符串字面量来创建一个CSV对象

let csv = CSV(string: "id,name,age\n1,Alice,18")

如果需要自定义分隔符可以这样

let tsv = CSV(string: "id\tname\tage\n1\tAlice\t18", delimiter: "\t")

我们可以传入路径及文件名来读取,可能会出错,所以使用try catch来捕获异常

// From a file (with errors)
do {
    let csv = try CSV(name: "users.csv")
} catch {
    // Catch errors or something
}

自定义换行符和编码方式

do {
    let tsv = try CSV(name: "users.tsv", delimiter: tab, encoding: NSUTF8StringEncoding)
} catch {
    // Error handling
}

数据读取

根据CSV的内容,写出如下的Model类
实际应用不要用中文
实际应用不要用中文
实际应用不要用中文

import Foundation
class SkillData:NSObject {
    var id:String?
    var name:String?
    var 快捷键:String?
    var 冷却时间:String?
    var 技能消耗:String?
    var Information:String?
}

数据读取是一个需要时间的过程,所以我们用GCD来在异步线程进行读取,通过一个回调函数来获取我们的数据,并且封装一个通用的读取方法

import Foundation
import SwiftCSV
class CSVReader {
    /**
     CSV读取
     
     - parameter fileName:         文件名
     - parameter completionHandle: completionHandle
     */
    class func loadDataFromCSV<T:NSObject>(fileName:String,completionHandle:([T])->Void){
        //异步读取
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
            let filePath = NSBundle.mainBundle().pathForResource(fileName, ofType: "csv")
            let csvURL = NSURL(fileURLWithPath: filePath!)
            do{
                let csv = try CSV(url: csvURL)
                let dataArray = csv.rows.map({ (dic:[String:String]) -> T in
                    let data = T()
                    dic.forEach({ (key,value) in
                        data.setValue(value, forKey: key)
                    })
                    return data
                })
                dispatch_async(dispatch_get_main_queue(), {
                    completionHandle(dataArray)
                })
            }catch{
                completionHandle([])
            }
        })
    }
}

随后我们在一个Manager类中创建业务相关的读取方法

import Foundation
class CSVDataManager{
    static let sharedInstance = CSVDataManager()
    var skillDataArray:[SkillData]?
    func loadSkillData(completionHandle:([SkillData])->Void) {
        if let data = skillDataArray{
            completionHandle(data)
        }else{
            CSVReader.loadDataFromCSV("skill data", completionHandle: { (data:[SkillData]) in
                self.skillDataArray =  data
                completionHandle(data)
            })
        }
    }
}
 类似资料: