2

.csv ファイルを解析したい。これには、CHCSV パーサーを使用します。しかし、パーサーが解析を開始するビューにプッシュすると、アプリがクラッシュします。

キャッチされていない例外 'NSMallocException' が原因でアプリを終了しています

NSString *filePath = @"http://somewhere.com/test.csv";
NSString *fileContent = [NSString stringWithContentsOfURL:[NSURL URLWithString:filePath] encoding:NSUTF8StringEncoding error:nil];
self.csvParser = [[CHCSVParser alloc] initWithContentsOfCSVFile:fileContent];


編集:

iOS 6+ 向けに開発しています。素晴らしいコメントと回答をありがとう。正しい解決策が得られることを願っています。

入力ストリーム
動作しません。入力ストリームを操作しようとすると、エンコーディングが間違っているためにアプリがクラッシュします。

'int' をタイプ 'NSStringEncoding *' (別名 'unsigned int *') のパラメーターに送信する、互換性のない整数からポインターへの変換

NSData *downloadData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://example.com/test.csv"]];
NSInputStream *stream = [NSInputStream inputStreamWithData:downloadData];
self.csvParser = [[CHCSVParser alloc] initWithInputStream:stream usedEncoding:NSUTF8StringEncoding delimiter:@";"];

self.csvParser.delegate = self;
[self.csvParser parse];



CSV-文字列

NSString *filePath = @"http://example.com/test.csv";
NSString *fileContent = [NSString stringWithContentsOfURL:[NSURL URLWithString:filePath] encoding:NSUTF8StringEncoding error:nil];  
self.csvParser = [[CHCSVParser alloc] initWithCSVString:fileContent];

self.csvParser.delegate = self;
[self.csvParser parse];


この解析のみ(null)

4

1 に答える 1

2

最終編集:の作成者である DaveCHCSVParserが github でコードを更新したため、最新バージョンを使用すると、この問題は解決されるはずです。今すぐ入手!


さて、ここに行きます:

まず、次のコードを に追加しますCHCSVParser.m

- (void)_sniffEncoding最初の方法では、次のものがあります。

uint8_t bytes[CHUNK_SIZE];
NSUInteger readLength = [_stream read:bytes maxLength:CHUNK_SIZE];
[_stringBuffer appendBytes:bytes length:readLength];
[self setTotalBytesRead:[self totalBytesRead] + readLength];

次のように変更します。

uint8_t bytes[CHUNK_SIZE];
NSUInteger readLength = [_stream read:bytes maxLength:CHUNK_SIZE];
if (readLength > CHUNK_SIZE) {
    readLength = CHUNK_SIZE;
}
[_stringBuffer appendBytes:bytes length:readLength];
[self setTotalBytesRead:[self totalBytesRead] + readLength];

その後、null値しか取得できなかったので、fileパスを変更しました (サンプル プロジェクトでは にありますmain()が、解析はviewDidLoad.

それが機能するように、バンドルディレクトリにファイルをコピーしたことを確認してください!

file = [NSBundle pathForResource:@"Test" ofType:@"scsv" inDirectory:[[NSBundle mainBundle] bundlePath]];

編集:

ファイルをダウンロードする必要があると言うときは、次のように実行できます (ただし、これは特にモバイル デバイスでは迅速で汚い解決策であることに注意してください)。

NSData *downloadData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.yourdomain.tld/Test.scsv"]];
NSInputStream *stream = [NSInputStream inputStreamWithData:downloadData];

最後の行は、ここで変更する必要がある重要な行です。

問題が解決することを願っています。

編集2:

コードが実際に機能するデモ プロジェクトを含むリポジトリを作成しました。おそらく、何が間違っているか (または少なくとも異なるか) を見つけることができます。ここにリンクがあります。

編集3:

変化する

self.csvParser = [[CHCSVParser alloc] initWithInputStream:stream usedEncoding:NSUTF8StringEncoding delimiter:@";"];

self.csvParser = [[CHCSVParser alloc] initWithInputStream:stream usedEncoding:&encoding delimiter:';'];
于 2013-04-21T16:50:39.080 に答える