CHCSV错误:无法为长度分配内存

时间:2013-04-21 15:14:23

标签: iphone ios objective-c csv

我想解析一个.csv文件。为此,我使用CHCSV Parser。但是当我进入解析器应该开始解析的视图时,应用程序崩溃了。

  

由于未捕获的异常终止应用' NSMallocException',原因:   ' * - [NSConcreteMutableData appendBytes:length:]:无法分配   记忆长度(4294967295)'

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)

1 个答案:

答案 0 :(得分:2)

最终编辑: CHCSVParser的作者Dave在github上更新了他的代码,因此在使用最新版本时应该解决这个问题。 Get it now!


好的,我们走了:

首先在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()中,但是我在{{1}中进行了解析}。

确保您已将文件复制到捆绑目录中以使其正常工作!

viewDidLoad

修改

当您说需要下载文件时,您可以执行以下操作(但请注意,这是快速而肮脏的解决方案,尤其是在移动设备上)

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

最后一行是你需要改变的重要一行。

希望能解决您的问题。

编辑2:

我刚刚为您创建了一个包含演示项目的存储库,其中代码实际工作。也许你可以找出你做错了什么(或者至少是不同的)。 Here is the link.

编辑3:

更改

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

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