Синтаксический анализ CSV-файла в Swift
мне нужно предварительно загрузить данные в мой tableView при запуске приложения. Поэтому я использую основные данные, анализируя a .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)
фатальная ошибка : индекс массива вне диапазона
что я делаю не так ? Пожалуйста, помогите мне.
2 ответов
вы пытаетесь распарсить путь к файлу, а не содержимое файла
Если заменить
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
}
}
тогда код будет работать для вашего примера файла.
на основе ошибки и где происходит ошибка, Я бы предположил, что ваш values
array не имеет 5 элементов, как вы думаете. Я бы поставил точку останова на линии, которая дает вам ошибку, и проверил бы ваш values
переменная и посмотреть, сколько в ней. С твоего .csv-файл, очевидно, имеет длину 5 элементов, тогда я бы предположил, что что-то не так в вашем разборе.