Nea*_*l L 13 csv iphone core-data objective-c
我正在使用Dave DeLong 用于Objective-C 的优秀CHCSVParser和一个非常长的.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]);
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
Dav*_*ong 17
我很高兴看到我的代码证明是有用的!:)
CHCSVParser行为与a类似NSXMLParser,因为每当它发现一些有趣的东西时,它会通过其中一个委托回调告诉你.但是,如果您选择忽略它在回调中提供的数据,那么它就消失了.这些解析器(CHCSVParser和NSXMLParser)非常愚蠢.他们只知道他们试图解析的东西的格式,但除此之外并没有做太多.
简而言之,答案是"你必须自己保存".如果你查看NSArray类别的代码,你会在.m文件中看到它使用一个简单的NSObject子类作为解析器委托,而那个子类是将字段聚合到一个数组中,然后将该数组添加到整个阵列.你需要做类似的事情.
示例代表:
@interface CSVParserDelegate : NSObject <CHCSVParserDelegate> {
NSMutableArray * currentRow;
}
@end
@implementation CSVParserDelegate
- (void) parser:(CHCSVParser *)parser didStartLine:(NSUInteger)lineNumber {
currentRow = [[NSMutableArray alloc] init];
}
- (void) parser:(CHCSVParser *)parser didReadField:(NSString *)field {
[currentRow addObject:field];
}
- (void) parser:(CHCSVParser *)parser didEndLine:(NSUInteger)lineNumber {
NSLog(@"finished line! %@", currentRow);
[self doSomethingWithLine:currentRow];
[currentRow release], currentRow = nil;
}
@end
Run Code Online (Sandbox Code Playgroud)
但是,我可以确信修改解析器的行为以聚合行本身,但是如果我沿着那条路走下去,为什么不让解析器聚合整个文件呢?(答案:不应该)
| 归档时间: |
|
| 查看次数: |
7276 次 |
| 最近记录: |