2012-02-13 89 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

你到目前为止尝试了什么? – 2012-02-13 19:19:41

+0

没有这个,真的。在过去,我曾经工作过的唯一正则表达式是用于简单的单行项目。 – 2012-02-13 19:23:21

+0

您可能需要NSScanner .... – 2012-02-13 19:23:41

回答

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”];'方法分解内容。 – 2012-02-13 22:45:33

0

目前,我只能将.rtf文件转换为常规文本文件。这使我可以更轻松地处理它们。

感谢您的帮助!我将考虑使用NSScanner更优雅地进行操作。