Я играю с Dave DeLong превосходным CHCSVParser для Objective-C с чрезвычайно длинным файлом .CSV, и я сталкиваюсь с некоторыми проблемами используй это. Я бы использовал метод arrayWithContentsOfCSVFile
, но я запускаю код на iPhone и разбор всего файла в память занимает больше памяти, чем доступно.
В моем коде ниже анализатор открывает документ и отлично вызывает методы делегата, но где в делегате я останавливаюсь после каждой строки и получаю доступ к данным (для создания и сохранения объекта Core Data в хранилище данных)? Я предполагаю, что это было бы в - (void) parser:(CHCSVParser *)parser didEndLine:(NSUInteger)lineNumber
, но как мне получить NSArray
(или что-то другое) данных из синтаксического анализатора, когда это делается с линией?
Вот мой код:
//
// The code from a method in my view controller:
//
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSFileManager *manager = [NSFileManager defaultManager];
NSError *err = nil;
NSArray *fileList = [manager contentsOfDirectoryAtPath:documentsDirectory error:&err];
NSString *fileName = [fileList objectAtIndex:1];
NSURL *inputFileURL = [NSURL fileURLWithPath: [documentsDirectory stringByAppendingPathComponent:fileName]];
NSStringEncoding encoding = 0;
CHCSVParser *p = [[CHCSVParser alloc] initWithContentsOfCSVFile:[inputFileURL path] usedEncoding:&encoding error:nil];
[p setParserDelegate:self];
[p parse];
[p release];
...
#pragma mark -
#pragma mark CHCSVParserDelegate methods
- (void) parser:(CHCSVParser *)parser didStartDocument:(NSString *)csvFile {
NSLog(@"Parser started!");
}
- (void) parser:(CHCSVParser *)parser didStartLine:(NSUInteger)lineNumber {
//NSLog(@"Parser started line: %i", lineNumber);
}
- (void) parser:(CHCSVParser *)parser didEndLine:(NSUInteger)lineNumber {
NSLog(@"Parser ended line: %i", lineNumber);
}
- (void) parser:(CHCSVParser *)parser didReadField:(NSString *)field {
//NSLog(@"Parser didReadField: %@", field);
}
- (void) parser:(CHCSVParser *)parser didEndDocument:(NSString *)csvFile {
NSLog(@"Parser ended document: %@", csvFile);
}
- (void) parser:(CHCSVParser *)parser didFailWithError:(NSError *)error {
NSLog(@"Parser failed with error: %@ %@", [error localizedDescription], [error userInfo]);
}
Спасибо!