Разбор этой строки в задаче C: 60,56 МБ / 237,03 МБ, 1526 Кбит / с, 25,5%, осталось 00:15:47 - PullRequest
1 голос
/ 20 июля 2009

Я пишу интерфейс для утилиты командной строки в Objective-C (Какао). Мне нужно проанализировать вывод, чтобы проверить различные типы сообщений. Есть два основных типа; информационные сообщения и сообщения о состоянии загрузки. Информационные сообщения всегда начинаются с одного из следующих: INFO :, WARNING :, ERROR: или:. Сообщения о состоянии загрузки выглядят следующим образом: 60,56 МБ / 237,03 МБ 1526 Кбит / с 25,5%, 00:15:47 осталось

Мне нужно определить, какой из двух типов сообщений является строкой, и, если это сообщение о состоянии загрузки, проанализировать процент и скорость. Если это информационное сообщение, я просто добавлю его в журнал. Я знаю, что мне понадобится сканер NSS для анализа компонентов. Что я действительно не могу понять, так это как проверить, является ли это сообщением о состоянии загрузки. Первые три типа информационных сообщений довольно легко обнаружить, но я также не уверен в четвертом типе.

Любая помощь будет принята с благодарностью.

Спасибо, Томас

Ответы [ 5 ]

2 голосов
/ 20 июля 2009
1 голос
/ 20 июля 2009

NSScanner может сделать эту работу.

Напишите функцию, которая создает сканер и пытается сканировать все значения, единицы измерения и промежуточные части (например, косую черту в одной точке и запятую позже). Если это удалось на всех из них, верните значения и, возможно, единицы по ссылке, и верните YES. Если ничего не сканируется, верните NO.

Затем вызовите эту функцию. Если он возвращает YES, это строка состояния, и переменные, адреса которых вы передали функции, теперь содержат значения. Если он возвращает NO, это не строка состояния (или ваш код сканирования пропустил регистр).

0 голосов
/ 21 июля 2009

Закончилось использованием сканера, как предложил Питер Хоси. Вот мое решение:

        if ([output hasPrefix:@"INFO:"] || [output hasPrefix:@"WARNING:"] || [output hasPrefix:@"ERROR:"] || 
        [output hasSuffix:@"default"] || [output hasPrefix:[show pid]])
    {
        //Add Status Message to Log
        [self addToLog:output noTag:YES];

        if ([output hasPrefix:@"ERROR: Failed to"])
        {
            [self addToLog:@"Download Failed" noTag:NO];
            NSLog(@"Download Failed");
        }
    }
    else
    {
        //Process Status Message
        [self addToLog:output noTag:YES];
        NSScanner *scanner = [NSScanner scannerWithString:output];
        NSDecimal recieved, total, percentage;
        NSInteger speed=0;
        NSString *timeRemaining;
        if(![scanner scanDecimal:&recieved]) recieved = [[NSNumber numberWithInt:0]decimalValue];
        [scanner scanUpToCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] 
                                intoString:nil];
        if(![scanner scanDecimal:&total]) total = [[NSNumber numberWithInt:0]decimalValue];
        [scanner scanUpToCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] 
                                intoString:nil];
        if(![scanner scanInteger:&speed]) speed = [[NSNumber numberWithInt:0]integerValue];
        [scanner scanUpToCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] 
                                intoString:nil];
        if(![scanner scanDecimal:&percentage]) percentage = [[NSNumber numberWithInt:0]decimalValue];
        [scanner scanUpToCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] 
                                intoString:nil];
        [scanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"a"] 
                                intoString:&timeRemaining];
0 голосов
/ 20 июля 2009

Как кто-то еще сказал, если возможно, сделайте ссылку на базовую библиотеку вместо анализа вывода инструмента cli. Если это не вариант, я не понимаю, почему вы не можете просто попытаться проанализировать сообщение о ходе выполнения, а если это не удастся, просто вернитесь к одному из других сообщений.

0 голосов
/ 20 июля 2009

Objective C также является полным стандартом C, а стандарт C предоставляет sscanf и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...