2009-06-21 5 views
1

NSScanner를 사용하여 쉼표와 구분 된 데이터를 구문 분석합니다. 구현하는 것이 매우 간단했지만 아주 간단한 문제가 있습니다. 비어있는 경우에도 다음 줄을 스캔하고 싶습니다. 지금 내가 가지고있는 문제는 빈 줄이 있으면 건너 뛰고 다음 줄을 읽는 것입니다. 잘못된 데이터가 잘못된 위치에 있기 때문에 구문 분석이 꺼져 있습니다. 다음 코드는 내가 지금 가지고 있습니다 :NSScanner - 다음 줄을 문자열로 스캔

그래서 데이터가과 같이 포맷
NSCharacterSet *setToIgnore = [NSCharacterSet characterSetWithCharactersInString:@",\r\n"]; 
[scanner setCharactersToBeSkipped:setToIgnore]; 

NSInteger levelID, campaignID; 
NSString *title, *about, *gameBoard; 
BOOL aTest = [scanner scanInteger:&levelID] && [scanner scanInteger:&campaignID]; 
aTest = [scanner scanUpToString:@"\r\n" intoString:&title]; 
aTest = [scanner scanUpToString:@"\r\n" intoString:&about]; 
aTest = [scanner scanUpToString:@"\r\n" intoString:&gameBoard]; 

: INT 문자열 문자열

때때로 문자열, 두 번째 문자열을 int로 (약) 비어 있으며 NSScanner 건너 뛰고 gameBoard 문자열을 읽습니다. NSScanner에게 다음 줄을 읽도록 지시하려면 어떻게해야합니까?

+0

가능한 경우 .plist를 NSDictionary로 읽는 것처럼 자동으로 구문 분석 할 수있는 형식을 사용하지 않으시겠습니까? –

답변

2

해결책 1 : setToIgnore 문을 제거하고 수동으로 구분 기호를지나 스캔 :

NSInteger levelID, campaignID; 
NSString *title, *about, *gameBoard; 
BOOL aTest = [scanner scanInteger:&levelID] 

[scanner setScanLocation:[scanner scanLocation]+1]; // skip comma 
aTest=[scanner scanInteger:&campaignID]; 
[scanner setScanLocation:[scanner scanLocation]+2]; // skip line break 
aTest = [scanner scanUpToString:@"\r\n" intoString:&title]; 
[scanner setScanLocation:[scanner scanLocation]+2]; // skip line break 
aTest = [scanner scanUpToString:@"\r\n" intoString:&about]; 
[scanner setScanLocation:[scanner scanLocation]+2]; // skip line break 
aTest = [scanner scanUpToString:@"\r\n" intoString:&gameBoard]; 
[scanner setScanLocation:[scanner scanLocation]+2]; // skip line break 

해결 방법 2를 다음과 함께 전체를 많이 바꾸을 통해 다음

NSArray *lines=[file componentsSeparatedByString:@"\r\n"]; 

그리고 루프 선을 개별적으로 분석 .

1

\r\n을 무시하지 마십시오.

관련 문제