Разбор произвольного текстового формата данных - PullRequest
1 голос
/ 13 февраля 2012

Я пытаюсь проанализировать файл .rtf, созданный кем-то другим, и у меня нет контроля над содержимым или форматом файла. В файле есть несколько блоков, и у каждого блока есть набор информации, который мне нужно получить. Каждый блок настроен так:

[Title]
[Type] ([sub type])
Level: [CSV list of levels]
Components: [CSV list of components]
Time: [proprietary time format]
Length: [length value]
Target: [target text]
Dwell: [dwell time in proprietary time format]
Saves: [yes/no]
Additional Information: [additional information]
[notes]

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

Насколько я могу судить, каждый блок разделен двойной линией.

Ответы [ 2 ]

5 голосов
/ 13 февраля 2012

Попробуйте использовать NSScanner, например:

NSString *input = 
    @"[Title]\n"
    @"[Type] ([sub type])\n"
    @"Level: [CSV list of levels]\n"
    @"Components: [CSV list of components]\n"
    @"Time: [proprietary time format]\n"
    @"Length: [length value]\n"
    @"Target: [target text]\n"
    @"Dwell: [dwell time in proprietary time format]\n"
    @"Saves: [yes/no]\n"
    @"Additional Information: [additional information]\n"
    @"[notes]\n";

NSString *title, *type, *subType, *level, *components, *time, *length, *target, *dwell, *saves, *additional, *notes;
title = type = subType = level = components = time = length = target = dwell = saves = additional = notes = nil;

NSScanner *scanner = [NSScanner scannerWithString:input];

// read the first line into title...
[scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&title];
[scanner scanCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:nil];

// read the first part of the second line into type
[scanner scanUpToString:@" (" intoString:&type];
[scanner scanString:@"(" intoString:nil];

// read the next part of the second line into subType
[scanner scanUpToString:@")" intoString:&subType];

// read the end of the line
[scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:nil];
[scanner scanCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:nil];

// read in level
[scanner scanString:@"Level: " intoString:nil];
[scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&level];
[scanner scanCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:nil];

// read in components:
[scanner scanString:@"Components: " intoString:nil];
[scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&components];
[scanner scanCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:nil];

// read in time:
[scanner scanString:@"Time: " intoString:nil];
[scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&time];
[scanner scanCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:nil];

// read in length
[scanner scanString:@"Length: " intoString:nil];
[scanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&length];
[scanner scanCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:nil];

// complete for all other metadata

NSLog(@"%@", title);
NSLog(@"%@ (%@)", type, subType);
NSLog(@"%@", level);
NSLog(@"%@", components);
NSLog(@"%@", time);
NSLog(@"%@", length);
NSLog(@"%@", target);
NSLog(@"%@", dwell);
NSLog(@"%@", saves);
NSLog(@"%@", additional);
NSLog(@"%@", notes);

Это работает для меня, очевидно, завершите процесс для всех остальных полей.

0 голосов
/ 15 февраля 2012

В настоящее время я могу просто конвертировать файлы .rtf в обычные текстовые файлы.Это позволяет мне легче их обрабатывать.

Спасибо за помощь!Я собираюсь изучить использование NSScanner, чтобы сделать это более элегантно.

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