在Objective C中将文本从一个数组解析为另一个数组

时间:2013-08-07 21:46:01

标签: objective-c

我从一个文本文件中创建了一个名为NSArray citiesList的数组,该文件将每个对象与行末尾的“,”分开。以下是文本文件中原始数据的样子。

City:San Jose|County:Santa Clara|Pop:945942,
City:San Francisco|County:San Francisco|Pop:805235,
City:Oakland|County:Alameda|Pop:390724,
City:Fremont|County:Alameda|Pop:214089,
City:Santa Rosa|County:Sonoma|Pop:167815,

citiesList数组很好(我可以看到计算对象,查看数据等)现在我想解析城市和Pop:在每个数组对象中。我假设您创建了一个for循环来运行对象,所以如果我想创建一个名为cityNames的可变数组来将城市名称填充到这个数组中,我会使用这种for循环:

SMutableArray *cityNames = [NSMutableArray array];
    for (NSString *i in citiesList) {
        [cityNames addObject:[???]];
    }

我的问题是我应该使用什么查询来查找城市:旧金山从我的阵列中的对象?

4 个答案:

答案 0 :(得分:2)

您可以继续使用componentsSeparatedByString来划分部分和键/值对。或者您可以使用NSScanner来读取解析键/值对的字符串。您可以使用rangeOfString查找“|”然后提取范围。这么多选择。

答案 1 :(得分:2)

这里的答案中有很多好的建议,以防你真的想要构造一个解析字符串的算法。

作为替代方案,您还可以将其视为声明数据结构的问题,然后让系统进行解析。对于像你这样的情况,正则表达式可以很好地完成。无论你喜欢这种方式还是其他方式,主要是品味和编码标准的问题。

在您的特定情况下(如果您需要从字符串中提取城市名称),那么还要注意有一些可用的快捷方式将其转换为单行解决方案:匹配整个字符串,定义一个捕获组并用一个捕获组替换一个新的字符串:

NSString *city = [i stringByReplacingOccurrencesOfString: @".*City:(.*?)\\|.*"
                                              withString: @"$1"
                                                 options: NSRegularExpressionSearch
                                                   range: NSMakeRange(0, row.length)];

变量i与您在for循环中定义的变量相同,即包含表示输入文件中一行的字符串的字符串:

City:San Jose|County:Santa Clara|Pop:945942,

我添加了初始.*,以便为添加到行中的未来新字段提供健壮的模式。如果您不喜欢,可以将其删除。

替换字符串中的$1表示第一个捕获组,即正则表达式中的括号。在这种特定情况下,子字符串包含城市名称。如果有更多的捕获组,他们将被命名为$ 2- $ 9。如果您想了解更多信息,可以查看有关NSRegularExpression和NSString的文档。

正则表达式是他们自己的主题,并不局限于Cocoa,尽管所有平台都使用具有自己特性的正则表达式实现。

答案 2 :(得分:1)

您想使用componentsSeparatedByString:,如下所示。 (这些行没有错误检查)

NSArray *fields = [i componentsSeparatedByString:@"|"];
NSString *city = [[[fields objectAtIndex:0] componentsSeparatedByString:@":"] objectAtIndex:1];
NSString *county = [[[fields objectAtIndex:1] componentsSeparatedByString:@":"] objectAtIndex:1];

如果你可以放下按键,还有几个这样的分隔符:

San Jose|Santa Clara|945942
San Francisco|San Francisco|805235
Oakland|Alameda|390724
Fremont|Alameda|214089
Santa Rosa|Sonoma|167815

然后你可以简化代码(仍然没有错误检查):

NSArray *fields = [i componentsSeparatedByString:@"|"];
NSString *city = [fields objectAtIndex:0];
NSString *county = [fields objectAtIndex:1];

答案 3 :(得分:1)

for (NSString *i in citiesList) {
  // Divide each city into an array, where object 0 is the name, 1 is county, 2 is pop
  NSArray *stringComponents = [i componentsSeparatedByString:@"|"];
  // Remove "City:" from string and add the city name to the array
  NSString *cityName = [[stringComponents objectAtIndex:0] stringByReplacingCharactersInRange:NSMakeRange(0, 5) withString:@""];
  [cityNames addObject:cityName];
}