Objective-C: анализ строки для объекта - PullRequest
0 голосов
/ 02 января 2012

У меня есть простой объект. Он имеет несколько свойств NSString (propertyA, propertyB, propertyC).

У меня есть строка (чтение из файла CSV) в следующем виде:

this is value A, this is value B, this is value C
another row A, another row B

Обратите внимание, что во второй строке отсутствует последнее свойство.

Я хочу разобрать строку в моем объекте. В настоящее время я беру строку из файла CSV и затем делаю это:

MyObject *something = [[MyObject alloc] init];
NSArray *split = [line componentsSeparatedByString:@","];

if (something.count > 0)
    something.propertyA = [split objectAtIndex:0];

if (something.count > 1) 
    something.propertyB = [split objectAtIndex:1];

if (something.count > 2)
    something.propertyC = [split objectAtIndex:2];

Это хорошо работает, но кажется действительно ужасным и хакерским! Кто-нибудь получил какие-либо предложения о том, как я могу улучшить код?

Ответы [ 4 ]

2 голосов
/ 02 января 2012

Взгляните на этот шаг о разборе CSV Где найти синтаксический анализатор CSV для NSArray для Objective-C?

Дейв ДеЛонг написал библиотеку анализатора CSV, вы можете найтиэто здесь: https://github.com/davedelong/CHCSVParser

Надеюсь, это поможет:)

0 голосов
/ 02 января 2012

Рассмотрите возможность использования массива ключей, которые соответствуют MyObject именам свойств. Например:

NSString *propertyNames[] = { @"property1", @"property2", @"property3" };

NSArray *values = [line componentsSeparatedByString:@","];
NSArray *keys = [NSArray arrayWithObjects:propertyNames count:[values count]];
NSDictionary *dict = [NSDictionary dictionaryWithObjects:values forKeys:keys];

MyObject obj = [[MyObject alloc] init];
[obj setValuesForKeysWithDictionary:dict];

Затем вы можете добавить initWithDictionary: метод к MyObject, который вызывает setValuesForKeysWithDictionary. Это помогло бы упростить процесс еще немного, позволив записать последние две строки выше в виде одной строки:

MyObject obj = [[MyObject alloc] initWithDictionary:dict];
0 голосов
/ 02 января 2012

Ваш подход на самом деле выглядит довольно здраво, учитывая формат ввода файла и предполагая, что ни один из элементов не содержит запятую внутри себя.Как уже упоминали другие, CSV и / или нестандартные плоские файлы требуют пользовательских решений, чтобы получить от них то, что вы хотите.

Если приведенный выше подход дает вам нужные данные, тогда я говорю, что используйте их.Если этого не произойдет, возможно, вы сможете рассказать о реальной проблеме, с которой вы столкнулись (например, какие данные вы получаете и чего ожидали?)

0 голосов
/ 02 января 2012

Вот расширение синтаксического анализа CSV для NSString, которое я использовал в прошлом для обработки данных CSV.

http://www.macresearch.org/cocoa-scientists-part-xxvi-parsing-csv-data

Если в основном добавляет метод -(NSArray *)csvRows к NSString, который возвращает NSArrayс каждой строкой в ​​ваших данных и NSArray внутри каждой строки для обработки столбцов.Это самый простой и чистый способ, который я нашел до сих пор, когда дело доходит до возникающих данных о CSV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...