Использование 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.

Другие вопросы по тегам