2012-02-13 13 views
1

他の人が作成した.rtfファイルを解析しようとしていますが、ファイルの内容や形式を制御できません。ファイルにはいくつかのブロックがあり、各ブロックには必要な情報があります。各ブロックは次のように設定されています。任意のテキストデータ形式の解析

[Title] 
[Type] ([sub type]) 
Level: [CSV list of levels] 
Components: [CSV list of components] 
Time: [proprietary time format] 
Length: [length value] 
Target: [target text] 
Dwell: [dwell time in proprietary time format] 
Saves: [yes/no] 
Additional Information: [additional information] 
[notes] 

各ファイルに上記のようなブロックが50〜100個あります。私はNSRegularExpressionクラスを使用して私のアプリでいくつかの他の解析を行っていますが、私はこれを達成する方法について考えることさえできません。

私が知る限り、各ブロックは二重線で区切られています。

+1

これまでに何を試みましたか? –

+0

これは本当に何もありません。過去に私が今までに仕事をしてきた唯一の正規表現は、シンプルで単一のラインアイテムです。 –

+0

あなたはおそらくNSScannerを必要とします.... –

答えて

5

はこのように、NSScannerを使用してみてください:

NSString *input = 
    @"[Title]\n" 
    @"[Type] ([sub type])\n" 
    @"Level: [CSV list of levels]\n" 
    @"Components: [CSV list of components]\n" 
    @"Time: [proprietary time format]\n" 
    @"Length: [length value]\n" 
    @"Target: [target text]\n" 
    @"Dwell: [dwell time in proprietary time format]\n" 
    @"Saves: [yes/no]\n" 
    @"Additional Information: [additional information]\n" 
    @"[notes]\n"; 

NSString *title, *type, *subType, *level, *components, *time, *length, *target, *dwell, *saves, *additional, *notes; 
title = type = subType = level = components = time = length = target = dwell = saves = additional = notes = nil; 

NSScanner *scanner = [NSScanner scannerWithString:input]; 

// read the first line into title... 
[scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&title]; 
[scanner scanCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:nil]; 

// read the first part of the second line into type 
[scanner scanUpToString:@" (" intoString:&type]; 
[scanner scanString:@"(" intoString:nil]; 

// read the next part of the second line into subType 
[scanner scanUpToString:@")" intoString:&subType]; 

// read the end of the line 
[scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:nil]; 
[scanner scanCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:nil]; 

// read in level 
[scanner scanString:@"Level: " intoString:nil]; 
[scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&level]; 
[scanner scanCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:nil]; 

// read in components: 
[scanner scanString:@"Components: " intoString:nil]; 
[scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&components]; 
[scanner scanCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:nil]; 

// read in time: 
[scanner scanString:@"Time: " intoString:nil]; 
[scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&time]; 
[scanner scanCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:nil]; 

// read in length 
[scanner scanString:@"Length: " intoString:nil]; 
[scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&length]; 
[scanner scanCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:nil]; 

// complete for all other metadata 

NSLog(@"%@", title); 
NSLog(@"%@ (%@)", type, subType); 
NSLog(@"%@", level); 
NSLog(@"%@", components); 
NSLog(@"%@", time); 
NSLog(@"%@", length); 
NSLog(@"%@", target); 
NSLog(@"%@", dwell); 
NSLog(@"%@", saves); 
NSLog(@"%@", additional); 
NSLog(@"%@", notes); 

これは私のために動作しますが、明らかに他のすべてのフィールドのためのプロセスを完了します。

+0

さて、私は、.rtfファイルを通常のテキストファイルに変換できるだけであることを理解しました。次に、[NSString componentsSeparatedByString:@ "\ n \ n"];メソッドを使用して内容を分割することができます。 –

0

当面は、.rtfファイルを通常のテキストファイルに変換できます。これにより、私はそれらをより簡単に処理することができます。

ありがとうございました! NSScannerを使用してこれをよりエレガントに行う方法を検討します。

関連する問題