2

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

由于未捕获的异常“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)

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 回答