Какой язык следует использовать для написания текстового анализатора и отображения результатов в удобной для пользователя форме?

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

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

Итак, я хочу написать программу, которая сможет разобрать этот массивный текст в кратчайшие сроки. Мы используем исключительно Windows, поэтому работа в Windows - обязательная. Наша текущая реализация выполняется на локальном веб-сервере, и я убежден, что запуск ее в виде приложения должен быть быстрее.

Все предложения будут полезны. Спасибо.

EDIT: Моя конечная цель - разобрать текст и отобразить его в гораздо более удобной для пользователя форме с такими цветами. Можете ли вы сделать это с помощью Perl и Python? Я знаю, что вы можете сделать это с помощью Java и С++. Таким образом, он будет функционировать, как "Блокнот", где вы открываете файл журнала, но на экране вы показываете удобный для пользователя формат вместо необработанного файла.

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

Ответ 1

Хммм, "пойдите с тем, что вы знаете", был хорошим ответом. Perl был разработан для такого рода вещей (но imo хорошо подходит для простого анализа, но я лично избегал его для сложных проектов).

Если это становится немного сложным, почему бы не использовать правильный синтаксис и настройку грамматики?

Lex и Yacc (или Flex и Bison) spring, но лично я бы всегда обращался за Antlr

Определите различные "слова" в терминах шаблонов (синтаксис) и правила для объединения этих слов (грамматика), а Antlr выплюнет программу для синтаксического анализа вашего ввода (вы можете иметь программу в Java, C, С++ и более (вы беспокоитесь о времени синтаксического анализа, поэтому выбирайте скомпилированный язык, конечно)).

Я лично считаю его утомительным для парсеров для ручного труда и еще более утомительным для их отладки, но AntlrWorks - прекрасная среда, которая действительно делает его кусочком торта...

Этот бит внизу определяет правило грамматики.

Если вы испортите свои правила грамматики, вы будете проинформированы. Это не относится к ручным анализаторам, где вы просто царапаете свой body part и задаетесь вопросом о "странных результатах"...

Проверьте это. Даже если вы считаете, что ваш проект сейчас тривиален, он может расти. И если у вас есть какой-либо интерес к разбору, вы должны сделать это ради себя, по крайней мере, знакомы с lex/yacc, но особенно Antlr (Works)

Ответ 2

Вы должны использовать язык, который ВЫ знаете... Если у вас не так много времени, чтобы завершить проект, вы также можете потратить время на изучение нового языка.

Ответ 3

Я бы предложил использовать Python или Perl. Разбор больших текстовых файлов с регулярными выражениями выполняется очень быстро.

Ответ 4

Какой бы язык ни использовался вашим сотрудником.

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

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

Ответ 5

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

Ответ 6

Я считаю, что perl считается хорошим выбором для синтаксического анализа текста.

Ответ 8

Разберите этот массивный текст в кратчайшие сроки.

Рассмотрим проект PADS от AT & T. Это специальный язык, совместимый с C, который разработан специально для высокоскоростного анализа файлов журнала и других форматов специальных hoc-данных. Там даже функция, где он может попытаться узнать ваш формат журнала из примеров, хотя я не знаю, удалось ли это сделать. Люди, стоящие за проектом, действительно умны, и это оказало большое влияние на телефонную компанию. PADS дает очень высокую производительность в потоках данных, которые генерируют гигабайты. Джо Боб говорит, проверяйте это.

Если "массивный текст в кратчайшие сроки", Perl и Python не являются ответом. Но если вам нужно взломать что-то не слишком медленное, и все в порядке, чтобы занять больше времени, Perl и Python могут быть в порядке. Темпы мегабайт на самом деле не такие большие.

Ответ 9

Perl хорош для обработки текста.

В Perl было написано несколько очень хороших программ обработки текста. Ack (замена grep) - это один.

Ответ 10

Звучит как работа для Perl, так как я не особенно забочусь о нем как о языке. ActivePerl - разумное распространение Perl для Windows.

Ответ 11

Я бы предложил Perl. Он был практически создан для анализа файлов журналов. Что касается вывода, я согласен с ghostdog74, HTML - путь. Perl имеет десятки модулей, которые позволяют создавать и/или шаблон HTML.

Я бы проанализировал данные с помощью регулярных выражений, а затем использовал Template:: Toolkit (в CPAN) для создания приятных страниц с использованием HTML и CSS-шаблонов.

Ответ 12

c/С++ или java... для c/С++ у меня есть фрагмент, который может вам помочь:

FILE *f = fopen(file, "rb");
if(f == NULL) {
    return DBDEMON_OPEN_ERROR; // open fail
}

for(int i = 0; feof(f) == 0; i++)

{

fscanf(f,"%d %s %s %c\n",  &db[i].id, &db[i].name[0], &db[i].uid[0], &db[i].priviledge);

db_size++;

}

fclose(f);

это чтение файла со следующим форматом:

int string string char

1 ЧТО-ТО НИЧЕГО Z

для структуры определяют следующим образом:

typedef struct {

    unsigned int    id;
    char        name[DBDEMON_NAME_MAXSIZE];
    char        uid[DBDEMON_UID_MAXSIZE];
    char        priviledge;
} DATABASE;

Используйте fscanf с осторожностью, так как не проверяются типы и т.д., это может привести к ошибкам. Но я думаю, что это довольно эффективно.