我正在创建一个使用包含一组位置的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