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

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

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

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

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

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

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

20
задан HenryAdamsJr 26 March 2010 в 14:57
поделиться

12 ответов

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

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

На ум приходят Lex и Yacc (или Flex и Bison), но лично я всегда тянулся к Antlr

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

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

Этот кусочек внизу - определение правила грамматики.

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

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

.
16
ответ дан 29 November 2019 в 23:29
поделиться

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

11
ответ дан 29 November 2019 в 23:29
поделиться

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

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

0
ответ дан 29 November 2019 в 23:29
поделиться

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

3
ответ дан 29 November 2019 в 23:29
поделиться

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

2
ответ дан 29 November 2019 в 23:29
поделиться

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

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

1
ответ дан 29 November 2019 в 23:29
поделиться

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

0
ответ дан 29 November 2019 в 23:29
поделиться

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

7
ответ дан 29 November 2019 в 23:29
поделиться

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

2
ответ дан 29 November 2019 в 23:29
поделиться

На каком бы языке ни говорил ваш коллега.

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

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

4
ответ дан 29 November 2019 в 23:29
поделиться

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

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

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

2
ответ дан 29 November 2019 в 23:29
поделиться

c / c ++ или java ... для c / 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 SOMETHING ANYTHING Z

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

typedef struct {

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

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

-2
ответ дан 29 November 2019 в 23:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: