我的应用程序目前从旧金山的.csv文件中获取数据(地图上的点)。
为了从旧金山和奥克兰(我添加的另一个.csv文件)获取数据,我应该在代码中进行哪些更改?
func setupData() {
pointsDataSource = PointsDataSource(with: "San Francisco")
//if let pointsDataSource = pointsDataSource {
//map.addAnnotations(pointsDataSource.annotations)
//}
}

发布于 2016-11-10 22:38:54
使用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对象中。
https://stackoverflow.com/questions/40529704
复制相似问题