2012-01-02 4 views
0

У меня есть простой объект. Он имеет несколько свойств NSString (свойствоA, свойствоB, свойство C).Objective-C: Строка parse для объекта

У меня есть строка (чтение из файла 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]; 

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

+0

CSV является грязный формат файла, так что у вас есть грязный код для синтаксического анализа. Но можете ли вы изменить свой файл данных с csv на json? – CarlJ

+0

csv довольно ужасно ... Есть веские причины использовать его в этом случае. – NeilD

+0

так что есть только грязный способ ... – CarlJ

ответ

0

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

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

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

0

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

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

+0

он достает мне нужные данные, но чувствует себя действительно грязным :) – NeilD

+0

Ha. Понял. Иногда грязные данные просто грязные. Вы МОЖЕТЕ использовать библиотеку синтаксического анализа CSV, но если вы уверены, что данные останутся в том же формате, который у вас есть (большой «если», конечно), я не уверен, что вы получите много от него (кроме дополнительного файла для поддержки). Мои 2 цента. –

0

Рассмотрите возможность использования массива ключей, которые соответствуют 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]; 
Смежные вопросы