2012-02-19 3 views
1

저는 iOS 개발을 처음 사용합니다. 쉼표로 구분 된 약 10 줄의 간단한 CSV 파일을 구문 분석하려고합니다. 나는 아래의 코드를 사용하고 있는데 왜 NSScanner 필드를 파싱 할 때 (아래 코드의 필드) 쉼표 다음의 문자열로 이동하지 않는지 이해할 수 없다. 나는 줄을 실행해야한다. 구분 기호를 지나치게하려면NSScanner 동작

[fields scanCharactersFromSet:fieldCharSet intoString:nil]; 

을 실행해야한다. 그러나 줄에 대해 똑같은 작업을 수행 할 필요는 없습니다. NSScanner은 자동으로 줄 바꿈 이후의 다음 줄로 위치를 설정합니다. 두 경우 모두 동일한 메소드를 사용하고 있습니다. - [lines scanUpToCharactersFromSet : intoString] 내가 이해하지 못하는 것이 있습니까? 여기

내가 구문 분석하려고 테스트 파일입니다

Name,Location,Number,Units 
A,AA,4,mm 
B,BB,3.5,km 
C,CC,10.2,mi 
D,DD,2,mm 
E,EE,6,in 
F,FF,2.8,m 
G,GG,3.7,km 
H,HH,4.3,mm 
I,II,4,km 

여기 내 코드입니다 : 다만 방법을 NSScanner 작품이다

-(void)parseFile { 
    NSCharacterSet *lineCharSet = [NSCharacterSet newlineCharacterSet]; 
    NSCharacterSet *fieldCharSet = [NSCharacterSet characterSetWithCharactersInString:self.separator]; 
    // import the file 

    NSStringEncoding *encoding = nil; 
    NSError *error = nil; 
    NSString *data = [[NSString alloc] initWithContentsOfURL:self.absoluteURL usedEncoding:encoding error:&error]; 
    NSString *line,*field; 


    NSScanner *lines = [NSScanner scannerWithString:data]; 
    while (![lines isAtEnd]) { 

     [lines scanUpToCharactersFromSet:lineCharSet intoString:&line];//automatically sets to next line - why? 



     NSLog(@"%@\n",line); 

     NSScanner *fields = [NSScanner scannerWithString:line]; 

     while (![fields isAtEnd]) { 

      [fields scanUpToCharactersFromSet:fieldCharSet intoString:&field]; 

      [fields scanCharactersFromSet:fieldCharSet intoString:nil]; //have to do this otherwise will not go to next symbol 

      NSLog(@"%@\n", field); 

     } 
    } 
} 

답변

2

. scanUpToCharactersFromSet:intoString:을 사용하면 까지 문자를 스캔하지만 세트의 문자는이 아닙니다. 세트의 과거 캐릭터로 이동하려면 다음 두 가지 옵션이 있습니다.

  1. 해당 문자를 스캔하십시오. 이제 scanCharactersFromSet:intoString:을 사용하여이 작업을 수행하고 있습니다. 당신이 할 수있는 또 다른 방법은 [fields scanString:self.separator intoString:nil]입니다.

  2. setCharactersToBeSkipped:을 사용하여 분리 문자를 건너 뛰도록 스캐너에 지시하십시오. 그러나 이렇게하면 빈 필드를 감지하는 것이 어려워집니다.

스캐너의 기본 문자 집합에는 줄 바꿈 문자가 포함됩니다. 이것이 외부 스캐너가 개행을 건너 뛰는 이유입니다.

NSScanner 대신 componentsSeparatedByString:을 사용하여이 작업을 수행 할 수 있습니다. 예 :

-(void)parseFile { 
    NSString *data = [[NSString alloc] initWithContentsOfURL:self.absoluteURL usedEncoding:encoding error:&error]; 

    for (NSString *line in [data componentsSeparatedByString:@"\n"]) { 
     if (line.length == 0) 
      continue; 

     NSLog(@"line: %@", line); 

     for (NSString *field in [line componentsSeparatedByString:self.separator]) { 
      NSLog(@" field: %@", field); 
     } 
    } 
} 
+0

롭, 답변 해 주셔서 감사합니다. 하지만, 라인에서 이것을 사용할 때 자동으로 스캔 위치를 다음 라인으로 증가시킵니다. – RXP

+0

나는 나의 대답을 편집했다. –

+0

Rob, 답장을 보내 주셔서 감사합니다. NSScanner의 기본 동작은 줄 바꿈과 공백을 건너 뛰는 것입니다. 나는이 부분을 놓쳤다. - rp – RXP

관련 문제