Использование NScanner для разбора файла CSV в массив словаря
Я создал приложение для iPhone, в котором есть словарный массив местоположений (широта, долгота, точка). Я создал массив, вручную вводя каждое значение.
myLocationArray = @[
@{
kStation : @"1",
kLatitude : @( 41.656467),
kLongitude : @(-81.277963)
},
@{
kStation : @"2",
kLatitude : @(41.657118),
kLongitude : @(-81.276545)
},
@{
kStation : @"3",
kLatitude : @(41.658493),
kLongitude : @(-81.273542)
},
...
Это хорошо и работает, но теперь я хочу создать этот массив программно, получая данные из файла.CSV. У меня есть файл.CSV (TestCSV.csv), который выглядит следующим образом.
41.656467,-81.277963,27200
41.657118,-81.276545,27650
41.658493,-81.273542,28631.5
41.660728,-81.268547,30195
41.661830,-81.266065,30991
41.662828,-81.263819,31700
41.663677,-81.261962,32300
41.664578,-81.259909,32950
41.666210,-81.256312,34100
41.666921,-81.254708,34605
41.668043,-81.252191,35400
41.669044,-81.250043,36099
Я хотел бы создать myLocationArray (с форматированием, как показано), анализируя TestCSV.csv с помощью NScanner. Я настроил для анализа моего файла данных.
NSString *pathToFile =[[NSBundle mainBundle] pathForResource:@"TestCSV" ofType: @"csv"];
NSString *fileString = [NSString stringWithContentsOfFile:pathToFile encoding:NSUTF8StringEncoding error:nil];
if (!fileString) {
NSLog(@"Error reading file.");
}
NSScanner *scanner = [NSScanner scannerWithString:fileString];
Мне нужна помощь отсюда, хотя. Я посмотрел много примеров, но мне кажется, что именно здесь мне нужно немного кода, настраиваемого для моего приложения. Спасибо заранее за ваше время.
2 ответа
Не пытайтесь заново изобрести колесо, так как в формате файла CSV есть пара подводных камней (которые даже не очень четко определены).
Например, есть особые случаи перевода строки и запятых в поле. Любой алгоритм, основанный только на разбиении на строки и запятые, будет давать неверные результаты при таком вводе. Также обратите внимание, что Excel не всегда использует запятую в качестве разделителя, в зависимости от локали.
Используйте библиотеку, такую как CHCSVParser, которая покроет эти ловушки.
Я вообще не понимаю, почему вы беспокоитесь о сканере, поскольку ваша структура настолько проста и предсказуема. Начните с пустого NSMutableArray. Вы можете разбить файл на такие строки:
NSArray *lines = [input componentsSeparatedByString:@"\n"];
Теперь перечислим этот массив. Для каждой строки вы можете разделить строку запятыми:
NSArray *nums = [oneLine componentsSeparatedByString:@","];
Массив nums
массив из трех значений NSString Для первых двух элементов массива преобразуйте их в двойные doubleValue
и оберните это в NSNumber. Создайте NSDictionary для этой строки и добавьте его в NSMutableArray.