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 

は私のコードです:

-(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

だけの方法NSScanner作品だこと。 scanUpToCharactersFromSet:intoString:を使用すると、文字はまでスキャンされますが、セット内の文字はには含まれません。セット内の過去の文字を移動するには、次の2つのオプションがあります。

  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

ロブ、お返事ありがとうございます。 NSScannerのデフォルトの動作は、改行と空白をスキップすることです。私はこの部分を見逃した。 -rp – RXP

関連する問題