【问题标题】:How to fetch data from 2 csv files in swift如何快速从 2 个 csv 文件中获取数据
【发布时间】:2016-11-10 14:13:29
【问题描述】:

我的应用目前从旧金山的 .csv 文件获取数据(地图上的点)。

为了从旧金山和奥克兰(我添加的另一个 .csv 文件)获取数据,我应该对代码进行哪些更改?

func setupData() {
pointsDataSource = PointsDataSource(with: "San Francisco")

//if let pointsDataSource = pointsDataSource {
//map.addAnnotations(pointsDataSource.annotations)
//}
}

【问题讨论】:

  • 我的应用已经扫描了 .csv 文件。我只问,它如何从 2 个文件而不是一个文件中扫描。必须对 m 代码进行一些小改动才能使其正常工作,但我是新手

标签: swift csv annotations mapkit


【解决方案1】:

有几种不同的方法可以使用 Swift 将 CSV 文件扫描到您的应用中。我发现我能够创建自己认为最有用的类方法。

我必须道歉,因为我没有参考其他帮助我的开发者的互联网帖子 - 如果我再次遇到他们,那么我一定会包括他们!

这是课程:

import Foundation

class CSVScanner {

class func debug(string:String){

    println("CSVScanner: \(string)")
}

class func runFunctionOnRowsFromFile(theColumnNames:Array<String>, withFileName theFileName:String, withFunction theFunction:(Dictionary<String, String>)->()) {

    if let strBundle = NSBundle.mainBundle().pathForResource(theFileName, ofType: "csv") {

        var encodingError:NSError? = nil

        if let fileObject = NSString(contentsOfFile: strBundle, encoding: NSUTF8StringEncoding, error: &encodingError){

            var fileObjectCleaned = fileObject.stringByReplacingOccurrencesOfString("\r", withString: "\n")

            fileObjectCleaned = fileObjectCleaned.stringByReplacingOccurrencesOfString("\n\n", withString: "\n")

            let objectArray = fileObjectCleaned.componentsSeparatedByString("\n")

            for anObjectRow in objectArray {

                let objectColumns = anObjectRow.componentsSeparatedByString(",")

                var aDictionaryEntry = Dictionary<String, String>()

                var columnIndex = 0

                for anObjectColumn in objectColumns {

                    aDictionaryEntry[theColumnNames[columnIndex]] = anObjectColumn.stringByReplacingOccurrencesOfString("\"", withString: "", options: NSStringCompareOptions.CaseInsensitiveSearch, range: nil)

                    columnIndex++
                }

                if aDictionaryEntry.count>1{
                    theFunction(aDictionaryEntry)
                }else{

                    CSVScanner.debug("No data extracted from row: \(anObjectRow) -> \(objectColumns)")
                }
            }
        }else{
            CSVScanner.debug("Unable to load csv file from path: \(strBundle)")

            if let errorString = encodingError?.description {

                CSVScanner.debug("Received encoding error: \(errorString)")
            }
        }
    }else{
        CSVScanner.debug("Unable to get path to csv file: \(theFileName).csv")
    }
  }
}

您可以像这样在代码中实现它:

var myCSVContents = Array<Dictionary<String, String>>()

CSVScanner.runFunctionOnRowsFromFile(["title", "body", "category"],    withFileName: "fileName.csv", withFunction: {

    (aRow:Dictionary<String, String>) in

    myCSVContents.append(aRow)

})

这将构建一个 Dictionary 对象数组,每个对象代表 CSV 中的一行。您需要提供一个数组作为第一个参数,其中包含 csv 文档的标题标签 - 确保为每一列都包含一个标签!

但是,请随意跳过将行添加到数组 - 您可以在每一行上运行您喜欢的任何函数。例如,您可能希望将这些直接添加到 CoreData 对象中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    相关资源
    最近更新 更多