Разобрать файл журнала с неизвестным количеством вложенных операторов - PullRequest
0 голосов
/ 15 августа 2011

У меня есть файл журнала в форме:

begin; x1
begin; y1
end; y1
begin; z1
begin; z2
end; z2
end; z1
end;x1

Я хочу разобрать этот файл в структуру данных, которая может выглядеть следующим образом:

x1 >
    y1
    z1 >
        z2

, поэтомуСобытие x1 содержит события y1 & z1, а событие z1 содержит событие z2.

Существует ли стандартный алгоритм, который может быть полезен в этой ситуации?

Я думаю, что, возможно, рекурсия могла бы помочь мне здесь, разветвляясь на каждое утверждение 'begin', чтобы правильно проанализировать все подэтапы.Любые предложения будут с благодарностью приняты.

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

Ответы [ 2 ]

1 голос
/ 15 августа 2011

Я бы пошел на парсер рекурсивного спуска.

LogTree Parse()
{
    LogTree current = new LogTree();
    if (!ReadBegin(current))
        return null;
    LogTree child = null;
    while ((child = Parse()) != null)
    {
        current.Chilren.Add(Child);
    }
    if (!ReadEnd(current))
        return null;
    return current;
}

bool ReadBegin(LogTree current)
{
    if (nexttoken != "begin")
        return false;
    readNextToken();
    current.Name = nexttoken;
    readNextToken();
    return true;
}

bool ReadEnd(LogTree current)
{
    if (nexttoken != "end")
        return false;
    readNextToken();
    if (current.Name != nexttoken)
        return false;
    readNextToken();
    return true;
}

и т.д.

Здесь мы имеем

class LogTree
{
    public string Name;
    public List<LogTree> Children = new List<LogTree>();
}
0 голосов
/ 15 августа 2011

почему бы не преобразовать его в XML как самый простой способ использования данных:

var xml = XDocument.Parse(string.Join("",text.Replace("; ", ";")
                                .Split(' ')
                                .Select(i => i.StartsWith("begin;") ? 
                                    i.Replace("begin;", "<node>") : "</node>")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...