tôi đang chơi xung quanh với Dave DeLong tuyệt vời CHCSVParser cho Objective-C với một tập tin CSV rất lâu và đang chạy vào một số vấn đề khi dùng nó. Tôi sẽ sử dụng phương pháp arrayWithContentsOfCSVFile
, nhưng tôi đang chạy mã trên iPhone và phân tích toàn bộ tệp vào bộ nhớ sẽ chiếm nhiều bộ nhớ hơn khả dụng.Làm thế nào để sử dụng các lớp CHCSVParser
Trong mã của tôi dưới đây, trình phân tích mở tài liệu và gọi phương thức đại biểu một cách hoàn hảo, nhưng trong đại biểu nào tôi dừng sau mỗi dòng và truy cập dữ liệu (để tạo và lưu đối tượng Dữ liệu cốt lõi vào kho dữ liệu) ? Tôi cho rằng đó sẽ là trong - (void) parser:(CHCSVParser *)parser didEndLine:(NSUInteger)lineNumber
, nhưng làm thế nào để tôi nhận được một NSArray
(hoặc bất kỳ) của các dữ liệu từ các phân tích cú pháp khi nó được thực hiện với dòng?
Đây là mã của tôi cho đến nay:
//
// 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]);
}
Cảm ơn!
Cảm ơn cho câu trả lời - Tôi không thể nói nếu phân tích cú pháp đã làm công việc này cho bạn (qua 'currentChunk' hoặc một số cách khác)! Nó sẽ được tốt đẹp không phải tự làm các tập hợp, nhưng đối với hầu hết các ứng dụng CSV phân tích chỉ thực sự được sử dụng trong một vài nơi cho I/O.Nếu ai đó muốn viết rằng ít bit một lần, nó sẽ có thể để phân lớp hoặc viết một danh mục trên CHCSVParserDelegate? –
@Neal 'CHCSVParserDelegate' là giao thức, vì vậy bạn không thể phân lớp nó. Để làm cho hành vi này hoạt động, bạn phải thay đổi 'CHCSVParser' trực tiếp hoặc phân lớp nó. Câu trả lời đơn giản nhất là tổng hợp dòng (như tôi làm trong câu trả lời) –
Không nghĩ vậy ... Cảm ơn rất nhiều lần vì công việc tuyệt vời ở đây! Trên thực tế, một sửa đổi nhỏ cho mã của bạn ... trong 'didEndLine', chúng ta cần thay đổi' currentLine' thành 'currentRow'. (Tôi muốn thay đổi nó nhưng không có đủ XP;)) –