【问题标题】:Trying to parse some text into an array试图将一些文本解析成一个数组
【发布时间】:2012-03-30 18:07:06
【问题描述】:

我已将此文本读入我试图解析为数组的 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]);
        }

【问题讨论】:

  • @ParthBhatt 每次添加答案时都会收到通知。你不需要在他的帖子的评论中拉皮条你的答案。已标记。
  • @RichardJ.RossIII:无论如何,这并不是出于那种意图。

标签: objective-c ios xcode nsstring nsarray


【解决方案1】:

看起来你真正想要的是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"]);

【讨论】:

  • 很好的答案,谢谢。完美运行。超出了我的要求。干杯。
  • @darren 这就是我们来这里的目的。回答您的问题,并超越您的期望,只需要一点代表。
【解决方案2】:

这是意料之中的。这是 NSArray 类参考必须说的 about componentsSeparatedByString

数组中的子字符串按照它们在接收器中的顺序出现。分隔符字符串的相邻出现在结果中产生空字符串。同样,如果字符串以分隔符开头或结尾,则第一个或最后一个子字符串分别为空。比如这个代码片段:

附:将输入先拆分成行,再按空格拆分,不是更简单吗?

【讨论】:

  • 谢谢。我确实希望将空格放入单个对象中,但我不明白为什么我删除零长度的代码并没有将它们全部删除。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    祝你工作顺利。

    【讨论】:

      【解决方案5】:

      如果字符串中每两项之间有换行符,则可以使用:

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

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

      希望对你有所帮助。

      【讨论】:

        猜你喜欢
        • 2016-01-15
        • 2022-07-08
        • 2012-03-28
        • 2012-08-12
        • 1970-01-01
        • 2011-04-20
        • 2014-12-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多