Вопрос

У меня есть огромный набор линий журналов, и мне нужно проанализировать каждую линию (поэтому эффективность очень важна).

Каждая строка журнала имеет вид

cust_name time_start time_end (IP или URL)*

Итак, IP-адрес, время, время и, возможно, пустой список IP-адресов или URL-адресов, разделенных точкой с запятой.Если в последнем списке есть только ip или url, разделителя нет.Если есть более 1, то они разделены полуколонами.

Мне нужен способ проанализировать эту строку и прочитать ее в структуру данных.Time_start или Time_end может быть системным временем или GMT.cust_name также может иметь несколько строк, разделенных пространствами.

Я могу сделать это, читая посимвольно и, по сути, написав свой собственный парсер.Есть лучший способ сделать это ?

Это было полезно?

Другие советы

Я добился успеха с Boost Tokenizer Для такого рода вещей. Это помогает разбить входной поток на токены с помощью пользовательских разделителей между токенами.

Используя регулярные выражения ( boost :: regex - хорошая реализация для C ++), вы можете легко разделить различные части вашей строки - cust_name, time_start ... и найти все, что URL \ ips

Второй шаг - более подробный анализ этих групп, если это необходимо. Например, даты можно анализировать с помощью библиотеки boost :: datetime (написание собственного анализатора, если формат строки не является стандартным).

Почему вы хотите сделать это в C ++? Это звучит как очевидная работа для чего-то вроде Perl.

Рассмотрите возможность использования библиотеки регулярных выражений ...

Пользовательский ввод требует пользовательского парсера. Или молитесь, чтобы был идеальный мир и ошибок не было. Особенно, если вы хотите иметь эффективность. Размещение некоторого кода может быть полезным.

ОБНОВЛЯТЬ кардинально изменил ответ!

У меня огромный набор строк журнала, и мне нужно проанализировать каждую строку (поэтому эффективность очень важна).

Просто имейте в виду, что C++ не сильно поможет с точки зрения эффективности в этой ситуации.Не обманывайтесь, полагая, что только потому, что у вас есть быстрый анализ кода на C++, ваша программа будет иметь высокую производительность!

Эффективность, которая вам здесь действительно нужна, — это производительность не на уровне «машинного кода» синтаксического кода, а на общем уровне алгоритма.

Подумайте о том, что вы пытаетесь сделать.
У вас есть огромный текстовый файл, и вы хотите преобразовать каждую строку в структуру данных.

Хранение огромный структура данных в памяти очень неэффективный, независимо от того, какой язык вы используете!

Что вам нужно сделать, так это «извлекать» одну строку за раз, преобразовать ее в структуру данных и работать с ней, затем, и только после того, как вы закончите со структурой данных, вы идете, извлекаете следующую строку и преобразуете его в структуру данных, разберитесь с ним и повторите.

Если вы это сделаете, вы уже устранили основное узкое место.

Кажется, что для анализа строки текста формат ваших данных довольно упрощен. Посмотрите аналогичный вопрос, который я задал некоторое время назад: Разбор строк C++ (стиль Python)

В вашем случае, я полагаю, вы могли бы использовать строковый поток и использовать >> оператор для чтения следующей «вещи» в строке.

видеть этот ответ например код.

В качестве альтернативы (я не хотел удалять эту часть !!) Если бы вы могли написать это в Python, это будет намного проще.Я не знаю вашей ситуации (кажется, вы застряли на C++), но все же

Посмотрите на эту презентацию, чтобы узнать, как эффективно выполнять подобные задачи с помощью выражений генератора Python: http://www.dabeaz.com/generators/Generators.pdf

Это стоит прочитать.На слайде 31 он говорит о том, что очень похоже на то, что вы пытаетесь сделать.

По крайней мере, это даст вам некоторое вдохновение.
Это также довольно убедительно демонстрирует, что производительность повышается не за счет конкретного кода синтаксического анализа строк, а за счет всего алгоритма.

Вы можете попытаться использовать простой словарь lex / yacc | flex / bison для разбора ввода такого типа.

Парсер, который вам нужен, звучит очень просто. Взгляните на это. Любой скомпилированный язык должен иметь возможность анализировать его по адресу очень высокая скорость Тогда вопрос в том, какую структуру данных вы строите & amp; сохранить.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top