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