如何在Objective-C中从服务器下载CSV文件
我正在开发一个新的iPhone应用程序,在这里我已经从本地parsing了一个'csv'文件,它和我一起工作。 当我尝试以编程方式从服务器上下载“csv”文件时,它不适合我。 你可以帮我吗?
从本地文件加载数据 (正常工作)
- (void)viewDidLoad { [super viewDidLoad]; NSString * file = [[NSBundle bundleForClass:[self class]] pathForResource:@"sample" ofType:@"csv"]; NSStringEncoding encoding = 0; NSString * csv = [NSString stringWithContentsOfFile:file usedEncoding:&encoding error:nil]; NSArray *fields = [csv CSVComponents]; NSLog(@"fields: %@", fields); //getting the result content }
从服务器下载文件 (失败)
-(void) connectionDidFinishLoading:(NSURLConnection *)connection { NSLog(@"connectionDidFinishLoading"); //nothing showing here NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSString *fullName = [NSString stringWithFormat:@"quotes.csv"]; NSString *fullFilePath = [NSString stringWithFormat:@"%@/%@",docDir,fullName]; [receivedData writeToFile:fullFilePath atomically:YES]; } -(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { NSLog(@"data: %@", data); //nothing showing here if (receivedData) [receivedData appendData:data]; else receivedData = [[NSMutableData alloc] initWithData:data]; } - (void)loadDatafromURL { NSURL *url = [NSURL URLWithString:@"http://download.finance.yahoo.com/d/quotes.csv?s=^GSPC,^IXIC,^dji,^GSPC,^BVSP,^GSPTSE,^FTSE,^GDAXI,^FCHI,^STOXX50E,^AEX,^IBEX,^SSMI,^N225,^AXJO,^HSI,^NSEI&f=sl1d1t1c1ohgv&e=.csv"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [NSURLConnection connectionWithRequest:request delegate:self]; }
实现这个方法:
-(void)connection:(NSURLConnection *)conn didFailWithError:(NSError *)error
你会发现你得到一个错误
Error Domain=NSURLErrorDomain Code=-1000 "bad URL" UserInfo=0xf663f40 {NSUnderlyingError=0xf663de0 "bad URL", NSLocalizedDescription=bad URL}
我已经研究过以这种方式下载信息,我认为你遇到的一个问题是单独的符号必须用“+”分隔。 另外,拉取索引时,不能将“^”符号作为URL的一部分。 您必须将其replace为“%5E”。
所以,添加这个:
- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"%@", [error description]); }
并将您的url更改为:
NSString *urlString = @"http://download.finance.yahoo.com/d/quotes.csv?s=^GSPC+^IXIC+^dji+^GSPC+^BVSP+^GSPTSE+^FTSE+^GDAXI+^FCHI+^STOXX50E+^AEX+^IBEX+^SSMI+^N225+^AXJO+^HSI+^NSEI&f=sl1d1t1c1ohgv&e=.csv"; NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]];
现在它适用于我! 我甚至检查了输出.csv文件,它看起来不错! 每行一个完整的报价。
如果你打算通过networking获取比单个csv更多的数据,你可以看看AFNetworking ,这是一个很好的networking操作库。
一个工作解决scheme将会看起来像这样:
- (void)getCSVAsynch { NSString *unescaped = @"http://download.finance.yahoo.com/d/quotes.csv?s=^GSPC,^IXIC,^dji,^GSPC,^BVSP,^GSPTSE,^FTSE,^GDAXI,^FCHI,^STOXX50E,^AEX,^IBEX,^SSMI,^N225,^AXJO,^HSI,^NSEI&f=sl1d1t1c1ohgv&e=.csv"; NSURL *url = [NSURL URLWithString:[unescaped stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"CSV: %@", [[NSString alloc] initWithBytes:[responseObject bytes] length:[responseObject length] encoding:NSUTF8StringEncoding]); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Things go boom. %@", [error localizedDescription]); }]; [operation start]; }