約 30K 行の .csv ファイルを解析しようとしています。以下は私のコードでした:
NSString *pathToGameLibrary = [[NSBundle mainBundle] pathForResource:@"GameLibrarySample" ofType:@"csv"];
NSArray *gameLibraryData = [NSArray arrayWithContentsOfCSVFile:pathToGameLibrary];
この実行の最後に、gameLibraryData は nil です。
次のコードは 30,000 行のデータをコンソールに出力するため、パスと csv ファイルの両方が有効であることを確認できます。
NSString *pathToGameLibrary = [[NSBundle mainBundle] pathForResource:@"GameLibrarySample" ofType:@"csv"];
NSString *fileString = [NSString stringWithContentsOfFile:pathToGameLibrary encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@", fileString);
このコードは機能しないため、失敗の原因は csv ファイルの長さに関係していると思います。以前の質問で、CHCSV の著者 Dave DeLong は次のように提案しています。
「これが非常に大きなファイルである場合は、CSV ファイルのローカル コピーへのパスを使用して CHCSVParser を割り当て/初期化する必要があります。」
だから...私は元のポスターがこのコードで試みたことに従おうとしました:
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 の支援に感謝します。
On Topic Post-Edit Question: とにかく、「非常に大きなファイル」と見なされるものは何ですか? 単純な「arrayWithContentsofCSVFile」で委任を使用するのが賢明なのはどの時点ですか?