2016-11-10 2 views
1

Мое приложение в настоящее время получает данные (точки на карте) из CSV-файла San Francisco.Как получить данные из 2 файлов csv в swift

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

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

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

enter image description here

+0

Мое приложение уже сканирует файл .csv. Я только спрашиваю, как он может сканировать из 2 файлов вместо одного. Должно быть небольшое изменение в m-коде, чтобы заставить его работать, но я новичок – Peter

ответ

0

Есть несколько различных методов сканирования файла размером 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) 

}) 

Это создаст массив словарь объектов, каждый из которых представляет собой строку из CSV. Вам необходимо предоставить массив в качестве первого параметра, который содержит метки заголовков вашего документа csv - убедитесь, что вы указали метку для каждого столбца!

Однако не стесняйтесь пропустить добавление строк в массив - вы можете запускать любую функцию, которая вам нравится в каждой строке. Например, вы можете добавить их непосредственно в объект CoreData.

 Смежные вопросы

  • Нет связанных вопросов^_^