0

約 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」で委任を使用するのが賢明なのはどの時点ですか?

4

1 に答える 1

1

とにかく、何が「非常に大きなファイル」とみなされるのでしょうか? 単純な「arrayWithContentsofCSVFile」で委任を使用するのが賢明なのはどの時点ですか?

CSV ファイルをCHCSVParser 読み取って解析する方法は、カテゴリ メソッドを使用しているか、デリゲート自体と直接やり取りしているかに関係なく同じです (これについては、こちらNSArrayで確認できます)。したがって、「非常に大きなファイル」とは、実際には大きすぎて全体をメモリに保持できない CSV ファイルです。メモリ消費量は列数と行数の両方に依存するため、明確な制限を与えることは困難です。NSArray

これが意味することは、-arrayWithContentsOfCSV大きなファイルで を使用したときに発生する問題は、nil を返すことではなく、メモリ不足の警告などとして現れるはずだということです。あなたがnil戻ってきたという事実は、何か他のことが起こっていることを示唆しています。

まず、ファイルをログに記録しようとしたので、そのファイルが存在することがわかります。そのファイルのはるかに小さなサブセットを解析しようとしましたか? 問題は、CSV の形式が正しくないことにある可能性があります。または、これは iOS で CSV を使用しているときに私自身に問題があったことです。CSV は正しくエンコードされていますか? Excel から直接出力している場合、ときどき壊れているように見える奇妙で奇妙なテキスト エンコーディングになってしまうことがあります。

いつでもCHCSVParser自分で解析メソッドをブレークポイントしてステップスルーし、何が起こっているかを確認できます。これがあなたに役立つことを願っています。お気づきのように、Dave DeLong は実際にここにかなりの数の投稿をしています。運が良ければ、彼がやって来て、私よりも多くの知恵を共有してくれるでしょう。

于 2013-06-19T22:38:49.207 に答える