So verwenden Sie die CHCSVParser-Klasse

Ich spiele mit Dave DeLongs exzellentem CHCSVParser für Objective-C mit einer extrem langen CSV-Datei und Probleme bei der Verwendung. Ich würde das @ verwendarrayWithContentsOfCSVFile -Methode, aber ich führe den Code auf einem iPhone aus und beim Parsen der gesamten Datei in den Speicher wird mehr Speicher benötigt, als verfügbar ist.

In meinem Code unten öffnet der Parser das Dokument und ruft die Delegatmethoden perfekt auf. Aber wo im Delegaten halte ich nach jeder Zeile an und greife auf die Daten zu (um ein Core Data-Objekt zu erstellen und im Datenspeicher zu speichern)? Ich nehme an das wäre in- (void) parser:(CHCSVParser *)parser didEndLine:(NSUInteger)lineNumber, aber wie bekomme ich einNSArray (oder was auch immer) der Daten aus dem Parser, wenn es mit der Zeile fertig ist?

Hier ist mein Code bisher:

//
// 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]);
}

Vielen Dank

Antworten auf die Frage(4)

Ihre Antwort auf die Frage