我正在尝试解析大约30K行的.csv文件。以下是我的代码:
NSString *pathToGameLibrary = [[NSBundle mainBundle] pathForResource:@"GameLibrarySample" ofType:@"csv"];
NSArray *gameLibraryData = [NSArray arrayWithContentsOfCSVFile:pathToGameLibrary];
在执行结束时,gameLibraryData为零。
我可以确认路径和csv文件都是有效的,因为以下代码向控制台吐出30,000行数据:
NSString *pathToGameLibrary = [[NSBundle mainBundle] pathForResource:@"GameLibrarySample" ofType:@"csv"];
NSString *fileString = [NSString stringWithContentsOfFile:pathToGameLibrary encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@", fileString);
因为这段代码不起作用,我认为失败与csv文件的长度有关。在earlier question中,CHCSV的作者Dave DeLong建议:
“如果这是一个非常大的文件,那么你需要分配/初始化一个 CHCSVParser,带有CSV文件本地副本的路径。“
所以......我试图按照the original poster尝试使用此代码进行操作:
NSString *pathToGameLibrary = [[NSBundle mainBundle] pathForResource:@"GameLibrarySample" ofType:@"csv"];
CHCSVParser *file = [[CHCSVParser alloc] initWithContentsOfCSVFile:pathToGameLibrary];
[file setDelegate:self];
此时允许检索数据的方法回调是:
- (void)parserDidBeginDocument:(CHCSVParser *)parser;
- (void)parserDidEndDocument:(CHCSVParser *)parser;
- (void)parser:(CHCSVParser *)parser didBeginLine:(NSUInteger)recordNumber;
- (void)parser:(CHCSVParser *)parser didEndLine:(NSUInteger)recordNumber;
- (void)parser:(CHCSVParser *)parser didReadField:(NSString *)field atIndex:(NSInteger)fieldIndex;
- (void)parser:(CHCSVParser *)parser didReadComment:(NSString *)comment;
- (void)parser:(CHCSVParser *)parser didFailWithError:(NSError *)error;
感谢yonosoytu的帮助。
关于主题后编辑问题:那么什么算是“非常大的文件”呢?在这一点上谨慎使用委托而不是简单的'arrayWithContentsofCSVFile'?
答案 0 :(得分:1)
那么什么算是“非常大的文件”呢?在这一点上谨慎使用委托而不是简单的'arrayWithContentsofCSVFile'?
CHCSVParser
读取和解析您的CSV文件的方式是相同的,无论您是使用NSArray
类别方法还是直接与代表本身交互(您可以自己看看here)。所以“一个非常大的文件”实际上是一个CSV文件,它太大而无法在整个内存中保存NSArray
。内存消耗将取决于列数和行数,因此很难给出明确的限制。
这意味着使用带有大文件的-arrayWithContentsOfCSV
所带来的问题不应该表现为返回nil,而应该表现为低内存警告等。你得到nil
的事实表明其他事情正在发生。
首先,您说您已尝试记录该文件,因此您知道它存在 - 您是否尝试过解析该文件的一个小得多的子集?问题可能是您的CSV格式不正确。或者 - 这是我在iOS上使用CSV时遇到的问题 - 您的CSV编码是否正确?有时,如果你直接从Excel输出,你最终会得到奇怪而奇怪的文本编码,这些编码偶尔会破坏。
您可以随时为CHCSVParser
中的解析方法断点并逐步执行解析,看看发生了什么。我希望这对你有用。正如你所发现的那样,Dave DeLong实际上在这里发帖很多 - 如果你很幸运,他可能会出现并分享更多的智慧。