试图将一些文本解析成数组

时间:2012-03-30 18:07:06

标签: objective-c ios xcode nsstring nsarray

我将此文本读入NSString * responce,我试图将其解析为数组。

        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 个答案:

答案 0 :(得分:4)

看起来你真正想要的是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 :(得分:1)

这是可以预料的。以下是NSArray类引用必须说的about componentsSeparatedByString

  

数组中的子串按照接收器中的顺序显示。相邻的分隔符字符串出现在结果中产生空字符串。类似地,如果字符串以分隔符开头或结尾,则第一个或最后一个子字符串分别为空。例如,此代码片段:

P.S。如果先将输入分成行,然后用空格分割,那会不会更容易?

答案 2 :(得分:1)

您编写的代码将每个单独的空格视为字段分隔符(提供大量空字段),而您尝试解析的数据将任意数量的空格视为字段分隔符。您将要使用NSScanner或NSRegularExpression跳过任意数量的空格。

答案 3 :(得分:0)

首先,调查使用NSScanner从您的字符串实例中获取您的信息。默认情况下,扫描程序会跳过空格和换行符。

其次,您的信息的前两行似乎包含的信息多于后续行。鉴于这种不一致性,您可以考虑创建一个模型类来保存数据,而不是简单的数组。

祝你工作顺利。

答案 4 :(得分:0)

如果字符串中的每两个项目之间都有新的行字符,则可以使用:

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

此外,如果它不是在每种情况下分隔两个组件的换行符,那么您需要找到一个分隔符,用于分隔数组的两个元素。

希望这会对你有所帮助。