2014-06-10 2 views
1

У меня есть файл, расположенный на /Users/admin/Desktop/wi-fi.txt, который содержит следующие ... Wi-Fi:Нахождение ключей/значений из вложенных NSDictionary

Software Versions: 
     CoreWLAN: 4.3.2 (432.47) 
     CoreWLANKit: 3.3.2 (332.36) 
     Menu Extra: 9.3.2 (932.35) 
     System Information: 9.0 (900.8) 
     IO80211 Family: 6.3 (630.35) 
     Diagnostics: 3.0 (300.40) 
     AirPort Utility: 6.3.2 (632.3) 
    Interfaces: 
    en1: 
     Card Type: AirPort Extreme (0x14E4, 0x10E) 
     Firmware Version: Broadcom BCM43xx 1.0 (5.106.98.100.22) 
     MAC Address: a8:86:dd:a9:6d:13 
     Locale: APAC 
     Country Code: IN 
     Supported PHY Modes: 802.11 a/b/g/n 
     Supported Channels: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165 
     Wake On Wireless: Supported 
     AirDrop: Supported 
     Status: Connected 
     Current Network Information: 
     DDL2: 
      PHY Mode: 802.11n 
      BSSID: c8:d7:19:62:1e:46 
      Channel: 6 
      Country Code: IN 
      Network Type: Infrastructure 
      Security: WPA2 Personal 
      Signal/Noise: -59 dBm/-86 dBm 
      Transmit Rate: 52 
      MCS Index: 11 
     Other Local Wi-Fi Networks: 
     DDL: 
      PHY Mode: 802.11g 
      BSSID: 00:1b:2f:df:04:bc 
      Channel: 10 
      Network Type: Infrastructure 
      Security: WEP 
      Signal/Noise: -57 dBm/-84 dBm 
     DDL3: 
      PHY Mode: 802.11n 
      BSSID: 28:c6:8e:dc:c8:db 
      Channel: 3 
      Network Type: Infrastructure 
      Security: WPA2 Personal 
      Signal/Noise: -56 dBm/-85 dBm 
     DDL4: 
      PHY Mode: 802.11n 
      BSSID: 40:16:7e:a2:3c:b4 
      Channel: 149,+1 
      Network Type: Infrastructure 
      Security: WPA2 Personal 
      Signal/Noise: -50 dBm/-92 dBm 
     DDL4: 
      PHY Mode: 802.11n 
      BSSID: 40:16:7e:a2:3c:b0 
      Channel: 6 
      Network Type: Infrastructure 
      Security: WPA2 Personal 
      Signal/Noise: -47 dBm/-81 dBm 
     NETGEAR: 
      PHY Mode: 802.11g 
      BSSID: 00:24:b2:bc:32:62 
      Channel: 1 
      Network Type: Infrastructure 
      Security: WEP 
      Signal/Noise: -84 dBm/-84 dBm 
     RS001: 
      PHY Mode: 802.11g 
      BSSID: b0:48:7a:c9:d8:f6 
      Channel: 11 
      Country Code: IN 
      Network Type: Infrastructure 
      Security: WPA Personal 
      Signal/Noise: -44 dBm/-90 dBm 
     RS002: 
      PHY Mode: 802.11g 
      BSSID: b0:48:7a:c9:d9:04 
      Channel: 12 
      Country Code: IN 
      Network Type: Infrastructure 
      Security: WPA Personal 
      Signal/Noise: -51 dBm/-90 dBm 
     RS003: 
      PHY Mode: 802.11g 
      BSSID: 00:1f:33:b4:99:2c 
      Channel: 11 
      Network Type: Infrastructure 
      Security: WPA Personal 
      Signal/Noise: -67 dBm/-90 dBm 
     fortinet_captive_portal: 
      PHY Mode: 802.11n 
      BSSID: 1a:5b:0e:39:57:b2 
      Channel: 6 
      Country Code: IN 
      Network Type: Infrastructure 
      Security: None 
      Signal/Noise: -85 dBm/-81 dBm 
     testlab: 
      PHY Mode: 802.11n 
      BSSID: 08:5b:0e:39:57:b2 
      Channel: 6 
      Country Code: IN 
      Network Type: Infrastructure 
      Security: WPA/WPA2 Personal 
      Signal/Noise: -83 dBm/-81 dBm 

I хотите получить информацию о каждом имени сети Wi-Fi и его шуме/силе. Пусть любой орган скажет мне, как это сделать.

+0

Разве вы не должны спрашивать, есть ли API для получения этой информации, а не использовать это громоздкое, медленное и хрупкое решение? Или вы уже пытались найти API и не смогли? – trojanfoe

+0

Я знаю API objectForKey, но я не знаю, как его использовать в случае вложенного. –

ответ

1

Не уверен, что я понимаю вопрос. Попытайтесь сделать это немного более понятным.

В любом случае, вот что я думаю, что понял.

NSString *path = [[NSBundle mainBundle] pathForResource:@"/Users/admin/Desktop/wi-fi" ofType:@"txt"]; 
NSArray *categories = [NSArray arrayWithContentsOfFile:path]; 
for (NSDictionary *category in categories) { 
    NSLog(@"%@", [category objectForKey:@"Interfaces"]); 
    NSLog(@"%@", [category objectForKey:@"Software Versions"]); 
} 

Я не управлял этим, но я думаю, что это должно сработать, дать ему шанс. Надеюсь, это нечто похожее на то, что вы ищете. Если нет, мы надеемся, что это в правильном направлении, и это приблизит вас к поиску вашего ответа. Счастливое кодирование!

редактировать:

Перетащите текстовый файл в ваш проект, а затем выполните следующие действия

NSString *path = [[NSBundle mainBundle] pathForResource:@"nsdictionarytextfile" ofType:@"txt"]; 
NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL]; 
NSArray *testArray = [content componentsSeparatedByString:@"\n"]; 
NSString *topDictionary = @""; 
NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
NSMutableDictionary *finalDict = [NSMutableDictionary dictionary]; 
for(NSString *s in testArray){ 
    NSArray *newArray = [s componentsSeparatedByString:@":"]; 
    if([newArray[1] isEqualToString:@""]){ 
     if([dict count] == 0){ 
      topDictionary = newArray[0]; 
     } 
     else{ 
      topDictionary = [topDictionary stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
      [finalDict setObject:[dict copy] forKey:[topDictionary copy]]; 
      [dict removeAllObjects]; 
     } 
    } else{ 
     NSString *object = [newArray[1] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
     NSString *key = [newArray[0] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
     [dict setObject:object forKey:key]; 
    } 
} 
topDictionary = [topDictionary stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
[finalDict setObject:dict forKey:topDictionary]; 
NSLog(@"finalDict: %@", finalDict); 

* ПОЖАЛУЙСТА НЕ ЧТО ЭТО НЕ ЗАВЕРШЕН! ВЫ ДОЛЖНЫ БЫТЬ БОЛЬШЕ ЛОГИКИ *

Не знаете, как вы хотите, но это должно дать вам представление о том, как оно должно работать. Я не понял полную логику добавления словаря верхнего уровня и его словарного уровня, но это должно поставить вас в правильном направлении. Я бы, наверное, начал с удаления обрезки, которую я положил в верхний словарь, и проверить пустое/белое пространство перед строкой и использовать это, чтобы выяснить, куда должен идти словарь. IE без пустого пространства означает, что он является самым высоким, и чем больше белых пробелов, тем «внутренним» он является в словаре. Надеюсь, это поможет вам начать работу.

+0

Для цикла не получается выполнить –

+1

Это потому, что 'NSBundle pathForResource' - это не способ открыть этот файл. Файл явно не является частью пакета приложений, поэтому зачем вообще «NSBundle». Также файл не является массивом. – trojanfoe

+0

@trojanfoe Вы правы. OP должен будет добавить файл, чтобы открыть файл, используя nsbundle. – Chris

0

У вас есть только текстовый файл для ввода. Это не вложенный словарь. Вы должны прочитать файл как текст и сначала проанализировать его.

Формат файла выглядит как YAML, но на данный момент это недействительно YAML. Если у вас есть доступ к коду, который генерирует файл, тогда, возможно, имеет смысл убедиться, что он генерирует действительный YAML. Затем вы можете использовать one of available libraries в Objective-C для анализа файлов YAML, чтобы получить вложенные NSDictionary s. В противном случае вы должны написать свой собственный синтаксический анализатор для входного текстового файла.

Смежные вопросы