Попытка разобрать некоторый текст в массив - PullRequest
0 голосов
/ 30 марта 2012

У меня есть этот текст, прочитанный в ответ NSString *, который я пытаюсь проанализировать в массив.

        total:    used:    free:  shared: buffers:  cached:
Mem:  30412800 16805888 13606912        0  1581056  4837376
Swap:        0        0        0
MemTotal:        29700 kB
MemFree:         13288 kB
MemShared:           0 kB
Buffers:          1544 kB
Cached:           4724 kB
SwapCached:          0 kB
Active:           1197 kB
Inactive:          699 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:        29700 kB
LowFree:         13288 kB
SwapTotal:           0 kB
SwapFree:            0 kB
Dirty:               0 kB
Writeback:           0 kB
Mapped:            277 kB
Slab:              132 kB
CommitLimit:     14848 kB
Committed_AS:     3400 kB
PageTables:       1567 kB
VmallocTotal:  1048404 kB
VmallocUsed:     17208 kB
VmallocChunk:  1031168 kB

Если я читаю в такой массив, я получаю более 300 объектов в массиве!

NSMutableArray *items2 = [NSMutableArray arrayWithArray:[responce componentsSeparatedByString:@" "]];
NSLog(@"count of memory array = %i",[items2 count]);

Я добавляю это, чтобы попытаться удалить все пустые, но все равно получаю 170.

for (int i=0; i<[items2 count]; i++) {
            NSString *str = [items2 objectAtIndex:i];
            if([str length]==0 || !str || str==nil) {
                [items2 removeObjectAtIndex:i];
            }
        }

Это утверждение NSLog говорит мне, что большинство из них имеют нулевую длину,почему где их не убрали?

for (int i=0; i<[items2 count]; i++) {
            NSLog(@"%i=%@ / length=%d",i,[items2 objectAtIndex:i],[[items2 objectAtIndex:i] length]);
        }

Ответы [ 5 ]

4 голосов
/ 30 марта 2012

Похоже, что вы действительно хотите это NSDictionary + NSScanner:

NSDictionary *scanString(NSString *str)
{
    NSScanner *scanner = [NSScanner scannerWithString:str];
    NSMutableDictionary *results = [NSMutableDictionary dictionary];

    // read away the first three lines (headers, mem, and swap). If you need this data, parse it here.
    for (int i = 0; i < 3; i++) {
        [scanner scanUpToString:@"\n" intoString:NULL];
    }

    NSString *line = nil;
    while ([scanner scanUpToString:@"\n" intoString:&line]) {
        // trim the line
        line = [line stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

        // read up to the ':'
        int loc = [line rangeOfString:@":"].location;
        NSString *key = [line substringToIndex:loc];

        // read the value associated with the key
        NSString *value = [[line substringFromIndex:loc + 1] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
        value = [value substringToIndex:[value rangeOfString:@" "].location];

        [results setObject:value forKey:key];
    }

    return results;
}

Это помещает его в словарь, к которому вы можете получить доступ с помощью следующего:

NSDictionary *parsed = scanString(response);
NSLog(@"Active Memory: %@", [parsed objectForKey:@"Active"]);
1 голос
/ 30 марта 2012

Код, который вы написали, обрабатывает каждое отдельное пространство как разделитель полей (давая огромное количество пустых полей), в то время как данные, которые вы пытаетесь проанализировать, обрабатывает любое количество пробелов как разделитель полей.Вы можете использовать NSScanner или NSRegularExpression, чтобы пропустить произвольное количество пробелов.

1 голос
/ 30 марта 2012

Этого следовало ожидать.Вот что говорит NSArray Class Reference о componentSeparatedByString :

Подстроки в массиве отображаются в порядке, который они сделали в приемнике.Смежные вхождения строки разделителя приводят к пустым строкам в результате.Аналогично, если строка начинается или заканчивается разделителем, первая или последняя подстрока соответственно пуста.Например, этот фрагмент кода:

PS Не будет ли проще, если сначала разбить ввод на строки, а затем разделить пробелами?

0 голосов
/ 30 марта 2012

Если у вас есть новые символы строки между каждыми двумя элементами в строке, вы можете использовать:

 NSArray *array = [yourResponseString componentsSeparatedByString:@"\n"];

Также, если это не символ новой строки, который разделяет два ваших компонента в каждом из случаев, тогда выНужно найти разделитель, который разделяет каждый из двух элементов вашего массива.

Надеюсь, это поможет вам.

0 голосов
/ 30 марта 2012

Во-первых, исследуйте использование NSScanner, чтобы получить вашу информацию из вашего экземпляра строки.По умолчанию сканеры пропускают пробелы и символы новой строки.

Во-вторых, кажется, что первые две строки вашей информации содержат больше информации, чем последующие строки.Учитывая это несоответствие, вы можете подумать о создании класса модели для хранения ваших данных, а не простого массива.

Удачи вам в ваших начинаниях.

...