我想解析一个.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)
。
答案 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:@";"];