1

私はiOS開発に非常に慣れていません。コンマで区切られた約10行の単純なcsvファイルを解析しようとしています。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);

        }
    }
}
4

1 に答える 1

2

それがまさにNSScanner仕組みです。を使用すると、セット内の文字を含まないscanUpToCharactersFromSet:intoString:までの文字がスキャンされます。セット内の過去の文字を移動する場合は、次の 2 つのオプションがあります。

  1. それらの文字をスキャンさせます。を使用してこれを実行していますscanCharactersFromSet:intoString:。あなたがそれを行うことができる別の方法はです[fields scanString:self.separator intoString:nil]

  2. を使用して、区切り文字をスキップすることをスキャナに伝えますsetCharactersToBeSkipped:。ただし、これにより、空のフィールドを検出することが難しくなります。

スキャナのデフォルトのスキップする文字セットには、改行が含まれています。そのため、外側のスキャナーは改行をスキップします。

componentsSeparatedByString:を使用する代わりに、 を使用してこれを完全に行うことができますNSScanner。例:

-(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);
        }
    }
}
于 2012-02-19T22:23:28.643 に答える