Разбор CSV файла в Swift

Мне нужно предварительно загрузить данные в мой TableView, когда приложение запустится. Поэтому я использую основные данные, анализируя CSV файл. Для этой цели я следую этот учебник. Вот моя функция parseCSV

func parseCSV (contentsOfURL: NSURL, encoding: NSStringEncoding, error: NSErrorPointer) -> [(stationName:String, stationType:String, stationLineType: String, stationLatitude: String, stationLongitude: String)]? {
    // Load the CSV file and parse it
    let delimiter = ","
    var stations:[(stationName:String, stationType:String, stationLineType: String, stationLatitude: String, stationLongitude: String)]?

    let content = String(contentsOfURL: contentsOfURL, encoding: encoding, error: error)
    stations = []
    let lines:[String] = content.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet()) as [String]

    for line in lines {
        var values:[String] = []
        if line != "" {
            // For a line with double quotes
            // we use NSScanner to perform the parsing
            if line.rangeOfString("\"") != nil {
                var textToScan:String = line
                var value:NSString?
                var textScanner:NSScanner = NSScanner(string: textToScan)
                while textScanner.string != "" {

                    if (textScanner.string as NSString).substringToIndex(1) == "\"" {
                        textScanner.scanLocation += 1
                        textScanner.scanUpToString("\"", intoString: &value)
                        textScanner.scanLocation += 1
                    } else {
                        textScanner.scanUpToString(delimiter, intoString: &value)
                    }

                    // Store the value into the values array
                    values.append(value as! String)

                    // Retrieve the unscanned remainder of the string
                    if textScanner.scanLocation < textScanner.string.characters.count {
                        textToScan = (textScanner.string as NSString).substringFromIndex(textScanner.scanLocation + 1)
                    } else {
                        textToScan = ""
                    }
                    textScanner = NSScanner(string: textToScan)
                }

                // For a line without double quotes, we can simply separate the string
                // by using the delimiter (e.g. comma)
            } else  {
                values = line.componentsSeparatedByString(delimiter)
            }

            // Put the values into the tuple and add it to the items array
            let station = (stationName: values[0], stationType: values[1], stationLineType: values[2], stationLatitude: values[3], stationLongitude: values[4])
            stations?.append(station)
        }
    }


    return stations
}

это мой файл .csv.

Rithala,Underground,Yellow Line,28.7209,77.1070

Но я получаю сообщение об ошибке в этой строке

let station = (stationName: values[0], stationType: values[1], stationLineType: values[2], stationLatitude: values[3], stationLongitude: values[4])
            stations?.append(station)

Неустранимая ошибка: индекс массива вне диапазона

Что я делаю неправильно? Пожалуйста, помогите мне.

Ответ 1

Вы пытаетесь проанализировать путь к файлу, а не содержимое файла

Если вы замените

let content = String(contentsOfURL: contentsOfURL, encoding: encoding, error: error)

с:

if let data = NSData(contentsOfURL: contentsOfURL) {
  if let content = NSString(data: data, encoding: NSUTF8StringEncoding) {
    //existing code
  }
}

тогда код будет работать для вашего файла примера.

Ответ 2

Основываясь на ошибке и где происходит ошибка, я бы предположил, что ваш массив values не имеет 5 элементов, как вы думаете. Я бы поставил точку останова на строке, которая дала вам ошибку и проверила вашу переменную values и посмотрела, сколько ее в ней. Поскольку ваш .csv файл, очевидно, имеет 5 элементов, я бы предположил, что в вашем разборе происходит что-то не так.