我正在尝试解析由其他人创建的.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
类在我的应用程序中进行其他解析,但我甚至无法考虑如何实现此目的。
据我所知,每个区块都用双线分隔。
答案 0 :(得分: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);
这对我有用,显然完成了所有其他领域的过程。
答案 1 :(得分:0)
暂时,我可以将.rtf文件转换为常规文本文件。这使我可以更容易地处理它们。
感谢您的帮助!我将考虑使用NSScanner来更优雅地完成这项工作。