NSScanner и файл CSV
У меня есть файл CSV с четырьмя полями: "Woonplaats", "Gemeente", "Provincie", "Latitude" и "Longitude".
Пример значений:
Graveland, Вейдемерен, Северная Голландия,52.24412000,5.12150000
Используя приведенный ниже код, я получаю строку в своем тексте, а затем хочу сохранить ее в массиве. Как я должен использовать NSScanner
получить данные из этой строки и сохранить в массив, содержащий словари?
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"cities" ofType:@"csv"];
NSString *myText = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil ];
NSScanner *scanner = [NSScanner scannerWithString:myText];
[scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"\n ,"]];
NSMutableArray *newPoints = [NSMutableArray array];
1 ответ
Я считаю, что это то, что вы ищете. Я использовал пост на форуме Dan Wood и изменил его для ваших нужд.
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// insert code here...
NSString *path =@"cities.csv";
NSError *error;
NSString *stringFromFileAtPath = [[NSString alloc]
initWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:&error];
NSMutableDictionary *lineDict = [NSMutableDictionary dictionary];
NSArray *lines = [stringFromFileAtPath componentsSeparatedByString:@"\n"];
NSEnumerator*theEnum = [lines objectEnumerator];
NSArray *keys = nil;
int keyCount = 0;
NSString *theLine;
while (nil != (theLine = [theEnum nextObject]) )
{
if (![theLine isEqualToString:@""] && ![theLine hasPrefix:@"#"]) // ignore empty lines and lines that start with #
{
if (nil == keys) // Is keys not set yet? If so, process first real line as list of keys
{
keys = [theLine componentsSeparatedByString:@","];
keyCount = [keys count];
}
else // A data line
{
NSArray *values = [theLine componentsSeparatedByString:@","];
int valueCount = [values count];
int i;
for ( i = 0 ; i < keyCount && i < valueCount ; i++ )
{
NSString *value = [values objectAtIndex:i];
if (nil != value && ![value isEqualToString:@""])
{
[lineDict setObject:value forKey:[keys objectAtIndex:i]];
}
}
}
}
}
for (id key in lineDict)
{
NSLog(@"key: %@, value: %@", key, [lineDict objectForKey:key]);
}
[pool drain];
return 0;
}
И вывод:
2011-07-13 20:02:41.898 cities[5964:903] key: Latitude, value: 52.24412000
2011-07-13 20:02:41.900 cities[5964:903] key: Provincie, value: Noord-Holland
2011-07-13 20:02:41.900 cities[5964:903] key: Longitude, value: 5.12150000
2011-07-13 20:02:41.901 cities[5964:903] key: Gemeente, value: Wijdemeren
2011-07-13 20:02:41.902 cities[5964:903] key: Woonplaats, value: Graveland