2014-02-10 4 views
3

В настоящее время я пытаюсь использовать CHCSVParser для анализа файлов CSV, содержащих более 1500 записей, и 8 строк. Мне удалось проанализировать файл, и я получаю NSArray от NSArrays из NSStrings.iOS: CHCSVParser & NSPredicate?

Например, вот что я получаю:

Loading CSV from: (
     (
     Last, 
     First, 
     Middle, 
     Nickname, 
     Gender, 
     City, 
     Age, 
     Email 
    ), 
     (
     Doe, 
     John, 
     Awesome, 
     "JD", 
     M, 
     "San Francisco", 
     "20", 
     "[email protected]" 
    ), 

Как я мог разобраться в этом в объект Person и процеживают через него с помощью NSPredicate, как Мэттт Томпсон делает here.

Вот как я инициализировать анализатор:

//Prepare Roster 
    NSString *pathToFile = [[NSBundle mainBundle] pathForResource:@"myFile" ofType: @"csv"]; 
    NSArray *myFile = [NSArray arrayWithContentsOfCSVFile:pathToFile options:CHCSVParserOptionsSanitizesFields]; 
    NSLog(@"Loading CSV from: %@", myFile); 

Вот что Mattt делает в этой статье я связан, что я хотел бы сделать с моим кодом:

NSArray *firstNames = @[ @"Alice", @"Bob", @"Charlie", @"Quentin" ]; 
NSArray *lastNames = @[ @"Smith", @"Jones", @"Smith", @"Alberts" ]; 
NSArray *ages = @[ @24, @27, @33, @31 ]; 

NSMutableArray *people = [NSMutableArray array]; 
[firstNames enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    Person *person = [[Person alloc] init]; 
    person.firstName = firstNames[idx]; 
    person.lastName = lastNames[idx]; 
    person.age = ages[idx]; 
    [people addObject:person]; 
}]; 

ответ

1

Во-первых, определить подходит Person класс:

@interface Person : NSObject 
@property(copy, nonatomic) NSString *firstName; 
@property(copy, nonatomic) NSString *lastName; 
// ... 
@property(nonatomic) int age; 
// ... 
@end 

Затем вы можете прочитать ваши данные в массив Person объектов, перечислив myFile массив. Внутри блока, row является «суб-массив» для одной строки:

NSMutableArray *people = [NSMutableArray array]; 
[myFile enumerateObjectsUsingBlock:^(NSArray *row, NSUInteger idx, BOOL *stop) { 
    if (row > 0) { // Skip row # 0 (the header) 
     Person *person = [[Person alloc] init]; 
     person.lastName = row[0]; 
     person.firstName = row[1]; 
     // ... 
     person.age = [row[6] intValue]; 
     // ... 
     [people addObject:person]; 
    } 
}]; 

Теперь вы можете отфильтровать этот массив, как показано в учебнике:

NSPredicate *smithPredicate = [NSPredicate predicateWithFormat:@"lastName = %@", @"Smith"]; 
NSArray *filtered = [people filteredArrayUsingPredicate:smithPredicate]; 
+0

Спасибо за пояснения и упрощения процесса ! – KingPolygon

Смежные вопросы