我从一个文本文件中创建了一个名为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:[???]];
}
我的问题是我应该使用什么查询来查找城市:旧金山从我的阵列中的对象?
答案 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];
}