NSSet无缘无故地获得NSStrings

时间:2012-03-28 10:54:13

标签: iphone objective-c nsstring nsset

我正在创建一个使用包含一组位置的CSV文件的游戏。

以下是其中一个CSV文件的摘录。

Name,Region,Country,Type
Bath,Somerset,United Kingdom,City
Brighton and Hove,Sussex,United Kingdom,City
Canterbury,Kent,United Kingdom,City
Chichester,West Sussex,United Kingdom,City
Durham,Durham,United Kingdom,City
Clevedon,Somerset,United Kingdom,Town

我编写了一个读取此数据的类,并创建了一个包含Fields(Name,Region,Country,Type)的数组和另一个包含数据所有行的多维数组(字段下面的任何内容)。

在MySql中有一个函数可以将特定字段中的行分组在一起,删除我在类中实现的所有重复项。这就是我的问题所在。

我正在使用此功能对Region字段进行分组,如果在上面的CSV数据中使用该字段将返回包含Somerset,Sussex,West Sussex,Durham,Kent的数组。 (请注意,只有一个Somerset而不是上面的两个)。然而,如果它们返回的区域有最后的空格,即“萨默塞特”。

我检查了CSV文件,我删除了所有找到的空格,并确保它们不是任何拼写错误的区域,但这并没有解决它。当我在课程组合之前输出控制台中的所有区域时,所有区域看起来都很好。

但是我发现当区域放入NSSet时会出现问题。在CSV数据中没有任何空格的区域突然有自己的副本版本,最后有一个空格。 (即NSSet有一个Somerset和一个“萨默塞特”,它应该只有萨默塞特)。

CSV没有任何问题,我的文件读取例程已经成功解析了CSV,因为我正确地获取了所有数据。只有当我把它放入NSSet时才会遇到奇怪的问题,因为它应该完全删除重复项。

以下是我的CSV类代码

部首:

  //
    //  CSV.h
    //  Guess The Distance
    //
    //  Created by James Campbell on 15/02/2012.
    //  Copyright (c) 2012 Cirencester College. All rights reserved.
    //

    #import <Foundation/Foundation.h>

    @interface CSV : NSObject {
        NSMutableArray *fields;
        NSMutableArray *rows;
    }
    @property (strong, readonly) NSMutableArray *fields;
    @property (strong, readonly) NSMutableArray *rows;
    -(CSV *)initWithCSVNamed:(NSString *)name fieldSeperator:(NSString *)fieldSeperator rowSeperator:(NSString *)rowSeperator;
    -(NSDictionary *)getRowAtIndex:(NSUInteger)index;
    -(NSArray *)getRowsForField:(NSString *)field Group:(BOOL)group;
    @end

实现:

//
//  CSV.m
//  Guess The Distance
//
//  Created by James Campbell on 15/02/2012.
//  Copyright (c) 2012 Cirencester College. All rights reserved.
//

#import "CSV.h"

@implementation CSV
@synthesize fields, rows;
-(CSV *)initWithCSVNamed:(NSString *)name fieldSeperator:(NSString *)fieldSeperator 
    rowSeperator:(NSString *)rowSeperator{
    self = [super init];
    NSLog(@"Reading CSV File...");
    NSString *filePath;
    if ([[name pathExtension] isEqualToString:@""]){
        filePath = [[NSBundle mainBundle] pathForResource:name ofType:nil];
    } else {
        filePath = [[NSBundle mainBundle] pathForResource:[[name lastPathComponent] stringByDeletingPathExtension] ofType:[name pathExtension]];
    }
    NSData *csvData = [NSData dataWithContentsOfFile:filePath]; 
    if (csvData) {  
        NSString *csvString = [[NSString alloc] initWithData:csvData encoding:NSASCIIStringEncoding];
        NSArray *csvRows = [csvString componentsSeparatedByString:rowSeperator];
        rows = [[NSMutableArray alloc] initWithCapacity:[csvRows count]-1];
        __block NSIndexSet *fieldIndexes;
        [csvRows enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            NSArray *csvFields = [(NSString *)obj componentsSeparatedByString:fieldSeperator];

            if(idx == 0){
                 fieldIndexes = [csvFields indexesOfObjectsPassingTest:
                                       ^BOOL (id el, NSUInteger i, BOOL *stop) {
                                           return (![(NSString *)el isEqualToString:@""]);
                                       }];
                fields = [[NSMutableArray alloc] initWithArray:[csvFields objectsAtIndexes:fieldIndexes]];;
            } else {
                [rows insertObject:[csvFields objectsAtIndexes:fieldIndexes] atIndex:idx-1];
            }
        }];
    }
    return self;
}
-(NSDictionary *)getRowAtIndex:(NSUInteger)index{
    NSArray *row = [rows objectAtIndex:index];
    return [[NSDictionary alloc] initWithObjects:row forKeys:fields];
}

-(NSArray *)getRowsForField:(NSString *)field Group:(BOOL)group{
    NSUInteger fieldIndex = [fields indexOfObject:field];
    id items;
    if (!group){
         NSMutableArray *itemArray = [[NSMutableArray alloc] init];
        items = itemArray;
    } else {
        NSMutableSet *itemSet = [[NSMutableSet alloc] init];
        items = itemSet;
    }
    [rows enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSString *row = [(NSArray *)obj objectAtIndex:fieldIndex];
        NSLog(@"|%@|", row);
        [items addObject:row];
    }];
    NSLog(@"%@", [items description]);
    if (!group){
        return [items copy];
    } else {
        return  [items allObjects];
    }
}
@end

0 个答案:

没有答案