【问题标题】:Parsing a big NSString解析一个大的 NSString
【发布时间】:2013-01-30 22:57:55
【问题描述】:

我有一个大的 NSString 对象,如下所示。我想解析这个字符串以获取其中的所有 icmp_seq 和时间值。我写的代码总是给我最后的价值。

任何想法如何以更好的方式做到这一点,除了用换行符分割它,然后在每次分割时运行解析器。

64 bytes from 74.125.129.105: icmp_seq=0 ttl=43 time=23.274 ms
64 bytes from 74.125.129.105: icmp_seq=1 ttl=43 time=28.704 ms
64 bytes from 74.125.129.105: icmp_seq=2 ttl=43 time=23.519 ms
64 bytes from 74.125.129.105: icmp_seq=3 ttl=43 time=23.548 ms
64 bytes from 74.125.129.105: icmp_seq=4 ttl=43 time=23.517 ms
64 bytes from 74.125.129.105: icmp_seq=5 ttl=43 time=23.293 ms
64 bytes from 74.125.129.105: icmp_seq=6 ttl=43 time=23.464 ms
64 bytes from 74.125.129.105: icmp_seq=7 ttl=43 time=23.323 ms
64 bytes from 74.125.129.105: icmp_seq=8 ttl=43 time=23.451 ms
64 bytes from 74.125.129.105: icmp_seq=9 ttl=43 time=23.560 ms

代码:

-(void)parsePingData:(NSString *)iData {
  NSRange anIcmpRange = [iData rangeOfString:@"icmp_seq"];
  NSRange aTtlRange =[iData rangeOfString:@"ttl"];
  NSRange icmpDataRange = NSMakeRange(anIcmpRange.location + 1, aTtlRange.location - (anIcmpRange.location + 1));
  NSLog(@"Output=%@",[iData substringWithRange:icmpDataRange]);    
}

【问题讨论】:

  • 我不认为有任何东西可以给你一个数组。您必须自己遍历这些条目。如果它真的很大,最好扫描字符串而不是拆分它,但这很简单——每行只有一个“:”,所以这是一个很好的字符。
  • 你考虑过使用 NSScanner 还是 NSRegularExpression?

标签: objective-c cocoa nsstring nsrange


【解决方案1】:

根据您发布的代码进行了一些更改,我们可以得到这样的结果:

NSRange range = NSMakeRange(0, largeString.length);
while (range.location != NSNotFound) {
  NSRange icmpRange = [largeString rangeOfString:@"icmp_seq=" options:NSLiteralSearch range:range];
  range.location = icmpRange.location + icmpRange.length;
  range.length = largeString.length - range.location;
  if (range.location != NSNotFound) {
    NSRange ttlRange = [largeString rangeOfString:@" ttl" options:NSLiteralSearch range:range];
    if (ttlRange.location != NSNotFound) {
      NSLog(@"icmp_seq = [%@]", [largeString substringWithRange:NSMakeRange(range.location, ttlRange.location - range.location)]);
    }
  }
}

保持更新的范围并使用rangeOfString:options:range,我们只能搜索我们尚未搜索的字符串部分。

【讨论】:

    【解决方案2】:

    这是一种方法。我相信有一个更好的解决方案,如果这看起来真的很糟糕,我很抱歉。但你可以这样做:

    NSArray *stringArray = [largeString componentsSeparatedByString: @":"];
    

    然后做一个for循环:

    for (int i = 1; i < stringArray.count; i++) {
         [self parsePingData:[stringArray objectAtIndex:i]];
    }
    

    我从 int i = 1 开始,因为索引 0 不会包含您想要的任何值。

    【讨论】:

    • 是的,但是当你开始 ping ipv6 地址时,你会怎么做,其中已经有:?听起来它可以使用一些改进......
    • 有效,我是通过 Hot Licks 评论来的。我环顾四周,看看是否有更好的解决方案。
    • 您可以使用其他您认为独特的东西。就像“来自的字节”。同样,这个解决方案看起来确实是一个奇怪/糟糕的解决方法,但它可能会奏效。
    猜你喜欢
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    相关资源
    最近更新 更多