如何使用NSScanner解析Cocoa中的制表符分隔字符串?

时间:2008-12-09 14:43:51

标签: objective-c cocoa parsing

我有一个Web服务,它返回制表符分隔的数据(参见下面的示例)。

我需要将其解析为数组或类似数据,以便我可以创建它的导航视图。

我已设法执行Web请求并可解析XML文件,但我对Objective-C的了解很少。

433 Eat
    502 Not Fussed
    442 British
    443 Chinese
    444 Dim Sum
    445 Fish
    446 French
    447 Gastropubs
    449 Indian
    451 Italian
    452 Japanese
    453 Middle Eastern
    454 Pan-Asian
    455 Pizza
    456 Spanish
    457 Tapas
    458 Thai
    459 Vegetarian
434 Drink
    501 Not Fussed
    460 Bars 
    461 Pubs

3 个答案:

答案 0 :(得分:7)

我不确定我是否完全理解你的格式(它对我来说有点奇怪),但最简单的方法是with - (NSArray *)componentsSeparatedByString:(NSString *)separator这是NSString类中的一个方法...例如:

NSArray *components = [myString componentsSeperatedByString:@"\t"];

这将返回NSArray NSStrings,每个制表符分隔字段一个。如果新行分隔符很重要,您可以使用- (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator(也在NSString上)使用多种分隔符进行拆分。

答案 1 :(得分:4)

我感觉不仅仅是一个平面列表。如果你想要一个多维结构,你可以这样做:

NSArray *lines = [data componentsSeparatedByString:@"\n"];
for (NSString *line in lines) {
    NSArray *fields = [line componentsSeparatedByString:@"\t"];
     // Do something here with each two-element array, such as add to an NSDictionary or to an NSArray (to make a multidimensional array.)
}

答案 2 :(得分:2)

你与NSScanner走在正确的轨道上。您至少需要两个扫描仪:一个用于扫描整个输入字符串中的行,另一个用于扫描每行扫描线。将整个输入扫描程序设置为仅跳过空格(而不是换行符),然后:

  1. 扫描一行(源字符串直到行尾)。
  2. 创建一个扫描仪并让它从该行扫描标签。
  3. 计算您扫描的标签。这是你的缩进级别。
  4. 该行的其余部分是条目编号和名称。您可以将行扫描到空格以分隔数字和名称,或将它们放在一起,具体取决于您的需要。
  5. 返回第1步。
  6. 有关具体的方法名称,请参阅the NSScanner class referencethe NSCharacterSet class reference