大家好.我正在使用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)
感谢有人能给我的任何帮助.
-[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)
这将返回NSArray的NSArrays的NSStrings.
与此类似,最后一种方法是使用NSArray类别方法:
NSString * csv = ...;
NSError * error = nil;
NSArray * rows = [NSArray arrayWithContentsOfCSVString:csv encoding:[csv fastestEncoding] error:&error];
Run Code Online (Sandbox Code Playgroud)
这将返回相同的结构(NSArray中NSArrays的NSStrings),但它也将为您提供一个NSError对象,如果它在CSV文件(即畸形CSV)遇到语法错误.