将远程csv加载到CHCSVParser中

Mat*_*att 3 csv iphone

大家好.我正在使用Dave DeLong的CHCSVParser来解析csv.我可以在本地解析csv,但我无法加载远程csv文件.今天我一直盯着我的MacBook方式,答案就在我面前.这是我的代码:

NSString *urlStr = [[NSString alloc] initWithFormat:@"http://www.somewhere.com/LunchSpecials.csv"];
NSURL *lunchFileURL = [NSURL URLWithString:urlStr];
NSStringEncoding encoding = 0;
CHCSVParser *p = [[CHCSVParser alloc] initWithContentsOfCSVFile:[lunchFileURL path] usedEncoding:&encoding error:nil];
[p setParserDelegate:self];
[p parse];
[p release];
Run Code Online (Sandbox Code Playgroud)

感谢有人能给我的任何帮助.

Dav*_*ong 6

-[NSURL path] 没有做你期望的事.

如果我有URL http://stackoverflow.com/questions/4636428,那-path就是/questions/4636428.当您将该路径传递给CHCSVParser时,它将尝试在本地系统上打开该路径.由于该文件不存在,您将无法打开它.

您需要做什么(正如Walter指出的那样)是在本地下载CSV文件,然后打开它.您可以通过几种不同的方式(下载文件+[NSString stringWithContentsOfURL:...],NSURLConnection等等).一旦您将文件本地保存到磁盘或内存中的CSV字符串,您就可以将其传递给解析器.

如果这是一个非常大的文件,那么您将需要alloc/ inita CHCSVParser与CSV文件的本地副本的路径.然后,解析器将逐位读取它,并通过委托回调告诉您它找到了什么.

如果CSV文件不是很大,那么你可以这样做:

NSString * csv = ...; //the NSString containing the contents of the CSV file
NSArray * rows = [csv CSVComponents];
Run Code Online (Sandbox Code Playgroud)

这将返回NSArrayNSArraysNSStrings.

与此类似,最后一种方法是使用NSArray类别方法:

NSString * csv = ...;
NSError * error = nil;
NSArray * rows = [NSArray arrayWithContentsOfCSVString:csv encoding:[csv fastestEncoding] error:&error];
Run Code Online (Sandbox Code Playgroud)

这将返回相同的结构(NSArrayNSArraysNSStrings),但它也将为您提供一个NSError对象,如果它在CSV文件(即畸形CSV)遇到语法错误.