2011-02-06 8 views
1

{"赤"、 "青"、 "緑"、 "黄"}が文字列として返されました。これを処理して配列に追加するには?NSScannerまたはcomponentsSeperatedByStringの使用方法

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    NSString* sampleString = @"{\"Red\",\"Blue\",\"Green\",\"Yellow\"}"; 
    NSArray* components = [sampleString componentsSeperatedByString:@"\"{"]; 

    [pool drain]; 
    return 0; 
} 

更新されたコード#

NSString* sampleString = @"{\"Red\",\"Blue\",\"Green\",\"Yellow\"}"; 

NSMutableArray *rows = [NSMutableArray array]; 

// Get newline character set 
NSMutableCharacterSet *removeCharacterSet = (id)[NSMutableCharacterSet characterSetWithCharactersInString:@"{(,}"]; 
[removeCharacterSet formIntersectionWithCharacterSet:[[NSCharacterSet whitespaceCharacterSet] invertedSet]]; 

// Characters that are important to the parser 
NSMutableCharacterSet *importantCharactersSet = (id)[NSMutableCharacterSet characterSetWithCharactersInString:@"\""]; 
[importantCharactersSet formUnionWithCharacterSet:removeCharacterSet]; 

// Create scanner, and scan string 
NSScanner *scanner = [NSScanner scannerWithString:sampleString]; 
[scanner setCharactersToBeSkipped:nil]; 
while (![scanner isAtEnd]) 
{   
    BOOL insideQuotes = NO; 
    BOOL finishedRow = NO; 
    NSMutableArray *columns = [NSMutableArray arrayWithCapacity:10]; 
    NSMutableString *currentColumn = [NSMutableString string]; 
    while (!finishedRow) 
    { 
     NSString *tempString; 
     if ([scanner scanUpToCharactersFromSet:importantCharactersSet intoString:&tempString]) { 
      [currentColumn appendString:tempString]; 
     } 

     if ([scanner isAtEnd]) { 
      if (![currentColumn isEqualToString:@""]) [columns addObject:currentColumn]; 
      finishedRow = YES; 
     } 
     else if ([scanner scanCharactersFromSet:removeCharacterSet intoString:&tempString]) { 
      if (insideQuotes) { 
       // Add line break to column text 
       [currentColumn appendString:tempString]; 
      } 
      else { 
       // End of row 
       if (![currentColumn isEqualToString:@""]) [columns addObject:currentColumn]; 
       finishedRow = YES; 
      } 
     } 
     else if ([scanner scanString:@"\"" intoString:NULL]) { 
      if (insideQuotes && [scanner scanString:@"\"" intoString:NULL]) { 
       // Replace double quotes with a single quote in the column string. 
       [currentColumn appendString:@"\""]; 
      } 
      else { 
       // Start or end of a quoted string. 
       insideQuotes = !insideQuotes; 
      } 
     } 
     else if ([scanner scanString:@"," intoString:NULL]) { 
      if (insideQuotes) { 
       [currentColumn appendString:@","]; 
      } 
      else { 
       // This is a column separating comma 
       [columns addObject:currentColumn]; 
       currentColumn = [NSMutableString string]; 
       [scanner scanCharactersFromSet:[NSCharacterSet whitespaceCharacterSet] intoString:NULL]; 
      } 
     } 
    } 
    if ([columns count] > 0) [rows addObject:columns]; 
} 
NSLog(@"This String:%@",[rows objectAtIndex:0]); 

私はhttp://www.macresearch.org/cocoa-scientists-part-xxvi-parsing-csv-dataからコードを得ました。今度の出力はThis String :(赤)、 "(" ")"を取り除く方法は?あなたは中括弧のために括弧を置換した場合、すべてのアレイを作成するために必要だろうと

NSScanner *scanner = [NSScanner scannerWithString:@"{\"Red\",\"Blue\",\"Green\",\"Yellow\"}"]; 
NSMutableCharacterSet *charactersToSkip = [NSMutableCharacterSet punctuationCharacterSet]; 
[scanner setCharactersToBeSkipped:charactersToSkip]; 
NSMutableArray *substrings = [NSMutableArray array]; 
NSString *substring = @""; 
while (![scanner isAtEnd]) { 
    [scanner scanUpToCharactersFromSet:charactersToSkip intoString:&substring]; 
    [scanner scanCharactersFromSet:charactersToSkip intoString:NULL]; 
    [substrings addObject:substring]; 
} 

NSLog(@"%@", substrings); 

注:

+1

それはより大きな形式の一部ですか、あるいは別の形式で表示されるのでしょうか、そこに他の種類/構造のデータが存在する可能性がありますか? –

+0

これは大きな形式の一部ではありません。私は現在NSStringクラスの使い方を学んでいるので、これはNSScannerとcomponentsSeperatedByStringの使い方を学ぶ例になります。 – ARC

答えて

1

は、ここであなたがNSScannerのインスタンスを使用して提供してきましたサンプルをスキャンする必要があるすべてです

NSString *sampleString = @"(\"Red\",\"Blue\",\"Green\",\"Yellow\")"; 
NSArray *strings = [sampleString propertyList]; 
NSLog(@"%@", strings); 

...しかし、私はあなたが達成する必要があることを本当に明確ではありません。

+0

彼はちょうどこの時点で困惑しているように見えます。誰もハードコーディングされた4色の文字列を作成して解析する人は誰もいません。 –

+0

私はこれが、彼のアプリが扱う大きな文字列のほんの少しのサンプルだと仮定していますが、本当の疑問は、実際の文字列の内容が実際にどれほど複雑になるかということです。公平になるためには、以前のコメントでは、特定の問題を解決するのではなく、この時点でAPIを探索することに主に関心があると述べていたように聞こえました。 – jlehr

+0

ありがとうございますjlehr.Iこれは答えとして受け入れます。複雑な文字列の場合、私の質問の更新されたコードは正しく動作するでしょうか?しかし、余分な(と)を追加しているコードを見てきたのですか...あなたが誰かがそれをどこから来ているのかを説明することができます – ARC

関連する問題