2012-04-30 3 views
4

새로운 iPhone 응용 프로그램을 개발 중입니다. 여기에서 로컬의 'csv'파일을 구문 분석하고 그 파일과 관련된 작업을 수행합니다. 프로그래밍 방식으로 서버에서 'csv'파일을 다운로드하려고하면 나에게 적합하지 않습니다. 저 좀 도와 주 시겠어요?Objective-C의 서버에서 CSV 파일을 다운로드하는 방법

-(void)connection:(NSURLConnection *)conn didFailWithError:(NSError *)error 

: 로컬 파일에서

데이터로드가

- (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]; 
} 
+0

당신의 오류가 무엇입니까 :

실제로 동작하는 솔루션은 다음과 같은 비트를 보일 것이다? –

+0

데이터가 내부에 들어오지 않습니다. - "connection didReceiveData" – shebi

+0

그 CSVComponents 메소드는 무엇입니까? –

답변

5

이 방법을 구현 (실패) 너 당신은 내가 이런 식으로 전에 다운로드 정보로 검토 한

Error Domain=NSURLErrorDomain Code=-1000 "bad URL" UserInfo=0xf663f40 {NSUnderlyingError=0xf663de0 "bad URL", NSLocalizedDescription=bad URL} 

의 오류가있어, 나는 당신이 데있어 하나의 문제는 별도의 문자가 "+"로 구분해야한다는 것입니다 생각 찾을 수 있습니다. 또한 색인을 가져올 때 "^"기호를 URL의 일부로 전달할 수 없습니다. "% 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 파일을 검사하기도 했으니 까 좋아 보인다. 한 줄에 하나의 인용문.

+1

또는 NSString에서 stringByAddingPercentEscapesUsingEncoding : NSASCIIStringEncoding 메서드를 사용하여 URL을 http 인코딩 할 수 있습니다. –

+0

대단히 고마워요! 지금은 괜찮아. – shebi

+1

@ BartVandendriessche 좋은 지적! 아마 더 읽기 쉬운 코드를 만들 것입니다! 내 코드에 변경 사항을 추가했습니다. – mbm29414

0

네트워크를 통해이 단일 CSV보다 많은 데이터를 가져 오려면 네트워크 작동을위한 훌륭한 라이브러리 인 AFNetworking을 살펴보십시오.

- (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]; 
} 
+0

내장 된 NSURLConnection이 작은 오버 헤드로 원하는 것을 정확히 수행하기 때문에 이것은 과도합니다. 헤더를 가져올 필요조차 없습니다! – mbm29414

+0

이것이 유일한 네트워킹 코드 일 경우 동의합니다. 그의 응용 프로그램이 네트워크를 통해 더 많은 데이터를 가져 오게된다면 AFNetworking을 살펴 보는 것이 그만한 가치가있을 것입니다. –

+0

충분합니다. 나는 터널 비전을 얻는 경향이 있으며 바로 옆에있는 질문에 집중합니다. :-) – mbm29414

관련 문제