Как получить данные из 2 CSV-файлов в Swift

В настоящее время мое приложение получает данные (точки на карте) из файла.csv Сан-Франциско.

Что я должен изменить в своем коде, чтобы получить данные из Сан-Франциско, а также из Окленда, еще одного файла.csv, который я добавил?

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

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

1 ответ

Существует несколько различных способов сканирования файла CSV в ваше приложение с помощью Swift. Я обнаружил, что смог создать свой собственный метод класса, который я считаю наиболее полезным.

Я должен извиниться, потому что я не ссылался на интернет-посты других разработчиков, которые помогли мне - если я столкнусь с ними снова, я обязательно включу их!

Вот класс:

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.

Другие вопросы по тегам