-1

私は xcode の初心者で、この質問はばかげているかもしれませんが、在宅勤務に遅れをとっています。
ファイルで、文字列の後に特定の文字を読みたい。

例:

asasasasasas
wewewewewewe
xyz_ 22 aaaaaaaaaaa bbbbbbbbbbb ccccccccccccccc ddddddddddddd
fgfgfgfgfgfgfg
ererererererer

abc_ 12 bbbbbbbbbb dddddddd
jkjkjkjkjkjkjk
lalallalalalal

マイコード:

NSString *contentFile = [[NSString alloc] initWithContentsOfFile:pathFile    encoding:NSUTF8StringEncoding error:nil];
NSArray *lineFile = [contentFile componentsSeparatedByString:@"\n"];
NSMutableString *xmlFile = [[NSMutableString alloc] init];
for(int i = 2; i < lineFile.count; i++)//i = 2 for don't take the 2 first line
{
    if ([((NSString *)[lineFile objectAtIndex:i]) rangedOfString:@"test"].location !=  NSNotFound){
        xmlFile = [NSString stringWithFormat:@"%@<nameTag>%@</nameTag>", xmlFile, (NSString *)[lineFile objectAtIndex:i]];
    }
    else if ...
}

すべてが正常に動作します..
しかし、xyz_の後に印刷したい...のように:

aaaaaaaaaaa 
bbbbbbbbbbb 
ccccccccccccccc 
ddddddddddddd
4

4 に答える 4

1

すべてが正常に動作します..しかし、xyz_の後に印刷したい...のように:

aaaaaaaaaaa
bbbbbbbbbbb
ccccccccccccccc
ddddddddddddd

私はあなたが何をしたいのかを正しく理解したことを願っています:

if ([([lineFile objectAtIndex:i]) rangedOfString:@"test"].location !=  NSNotFound)
{
    xmlFile = [NSString stringWithFormat:@"%@<nameTag>%@</nameTag>", xmlFile, (NSString *)[lineFile objectAtIndex:i]];
    NSString* str= [[lineFile objectAtIndex: i]stringByReplacingOccurrencesOfString: @"xyz_ " withString: @""];
    NSLog(@"%@",[str stringByReplacingOccurrencesOfString: @" " withString: @"\n"]);
}
于 2012-12-14T13:05:04.480 に答える
1

これも試すことができます:(別のテストアプリで試すことをお勧めします)

私はあなたのターゲットラインを想定しています:

xyz_ 22 aaaaaaaaaaa bbbbbbbbbbb ccccccccccccccc ddddddddddddd

常に「xyz_ 22」で始まります。ここをチェックしてください:(コメントも参照してください)

    // prepared a string similar to what you already have
    NSMutableString *xmlfile = [[NSMutableString alloc] initWithFormat:@"%@\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%@",
    @"asasasasasas",
    @"wewewewewewe",
    @"xyz_ 22 aaaaaaaaaaa bbbbbbbbbbb ccccccccccccccc ddddddddddddd",
    @"fgfgfgfgfgfgfg",
    @"ererererererer",
    @"",
    @"abc_ 12 bbbbbbbbbb dddddddd",
    @"jkjkjkjkjkjkjk",
    @"lalallalalalal"];

    NSLog(@"%@", xmlfile);    // check out by printing (optional)

    NSArray *arr = [xmlfile componentsSeparatedByString:@"\n"];  // first break with NEWLINE character
    NSLog(@"%@",arr);         // check out by printing (optional)


 for (NSString *str in arr)    // traverse all lines
{
    if([str hasPrefix:@"xyz_ 22"])  // if it starts with "xyz_ 22"
    {

        NSMutableArray *mArr = [[NSMutableArray alloc] initWithArray:[[str stringByReplacingOccurrencesOfString:@"xyz_ 22 " withString:@""] componentsSeparatedByString:@" "]];

         for(int i=0; i< [mArr count];i++ )
         {
            NSString *tag;

            if([[mArr objectAtIndex:i] length] > 3)
            {
                // If more than three i.e., aaaaa then write <aaa>aaaaaaa<aaa>
                tag = [[mArr objectAtIndex:i] substringWithRange:NSMakeRange(0, 3)];
            }
            else
            {
                // If less than three i.e., aa then pick <aa>aa<aa> or 
                                            a  then pick <a>a<a>
                tag = [mArr objectAtIndex:i];
            }

            NSString *s= [[NSString alloc] initWithFormat:@"<%@>%@<%@>", tag, [mArr objectAtIndex:i], tag];
            [mArr removeObjectAtIndex:i];
            [mArr insertObject:s atIndex:i];

        }

        NSLog(@"%@", mArr);   // prints output
    }
}

行頭が「xyz_ 22」で固定されていない場合は、NSRegularExpressionクラスを見て、使用する代わりにそれを使用する必要がありますhasPrefix

このサンプル パターンは、次の場合に役立ちます。

@"^(.{3}\_\s*\d{2}\s*)"

このパターンは、3 文字の後にアンダースコアとスペースが続き、その後に 2 桁の数字とスペースが続く行に一致します。

必要に応じて、これらの関数のいずれかを使用できます。

firstMatchInString:オプション:範囲:

一致する文字列:オプション:範囲:

numberOfMatchesInString:オプション:範囲:

それが役に立てば幸い。

幸せなコーディングと読書!!!

編集:

コードを更新しましたが、いいえに疑問があります。コメントで指定したタグ内の文字数。これにより、この問題を回避する方法についてのアイデアが得られます。

于 2012-12-14T16:13:06.383 に答える
0

文字列"test"は、フォーマットする文字列に存在しません。削除してから、[contentFile componentsSeparatedByString@""]を試してください。

于 2012-12-14T13:05:52.827 に答える