我应该使用什么语言编写文本解析器并以用户友好的方式显示结果?

时间:2010-03-25 21:58:10

标签: parsing text

我公司的专有软件会生成一个日志文件,如果解析它会更容易使用。我们都使用的日志解析器是由另一个员工编写的一个副项目,它的性能很糟糕。

这些日志文件可以非常快速地增长到10兆字节,如果日志文件大于1兆字节,我们当前使用的解析器会出现问题。

所以,我想编写一个程序,可以在最短的时间内解析大量的文本。我们专门使用Windows,因此必须在Windows上运行。我们当前的实现在本地Web服务器上运行,我确信将其作为应用程序运行必须更快。

所有建议都会有所帮助。感谢。

编辑:我的最终目标是解析文本并以更加用户友好的方式显示颜色等。你能用Perl和Python做到这一点吗?我知道你可以用Java和C ++做到这一点。因此,它将像记事本一样打开日志文件,但在屏幕上显示用户友好的格式而不是原始文件。

编辑:所以,我无法选择最佳答案,那就是选择一种能够最好地展示我的目标的语言,然后在其中编写解析器。此外,使用ANTLR可能会使此过程更容易。我改变了原来的问题,因为我想我没有问我到底在想什么。谢谢大家!

12 个答案:

答案 0 :(得分:16)

嗯,“按照你所知道的去做”是一个很好的答案。 Perl是为这种事物而设计的(但imo非常适合简单的解析,但我个人会在复杂的项目中避免使用它)。

如果它变得有点复杂,为什么不使用正确的语法和语法设置?

Lex& Yacc(或Flex& Bison)浮现在脑海中,但我个人总是想到Antlr

根据模式(语法)定义各种“单词”,并组合这些单词(语法)和Antlr的规则将吐出一个程序来解析您的输入(您可以使用Java,C,C ++等程序) (你担心解析时间,所以当然选择一种编译语言))。

我个人认为手工制作解析器很繁琐,调试它们更加繁琐,但AntlrWorks是一个可爱的IDE,真的让它变得轻而易举......

底部的那一点是定义语法规则。

如果你弄乱了你的语法规则,你会被告知。对于手工制作的解析器来说情况并非如此,您只需抓住body part并对“奇怪的结果”感到疑惑......

检查出来。即使您认为您的项目现在微不足道,它也可能会增长。如果您对解析感兴趣,至少要熟悉lex / yacc,尤其是Antlr(Works)

答案 1 :(得分:11)

你应该使用你所知道的语言......除非你有足够的时间来完成项目,否则你也可以花时间学习一门新语言。

答案 2 :(得分:7)

我建议使用Python或Perl。使用正则表达式解析大型文本文件非常快。

答案 3 :(得分:4)

无论你的同事使用什么语言。

(我可以告诉你,任何宏汇编程序都会让你编写会破坏你数据的代码,但是说真的,你会花几个月时间编写汇编只是为了节省几秒的CPU时间吗?重写一个程序很有趣但它不是practical。)

鞭打你的探查器,将它指向你可怕的日志解析器,并修复性能问题。如果它是一种通用语言,那么这里会有人可以提供帮助。

答案 4 :(得分:3)

我使用过Python和Perl。 Perl更适合这种情况,但很难维护。 Python也会这样做,并且更容易阅读。去寻找Python。

答案 5 :(得分:2)

我相信perl被认为是解析文本的好选择。

答案 6 :(得分:2)

也许MS LogParserusage podcast here)这样的成品可能会满足您的需求而且它是免费的。

答案 7 :(得分:2)

  

在尽可能短的时间内解析大量文本。

考虑来自AT& T的PADS Project。它是一种与C兼容的专用语言,专为高速解析日志文件和其他 ad hoc 数据格式而设计。甚至还有一个功能,它可以尝试从示例中学习您的日志格式,虽然我不知道它是否已经投入生产。该项目背后的人非常聪明,并且在电话公司中产生了很大的影响。 PADS在产生千兆字节的数据流上提供非常高的性能。乔鲍勃说检查一下。

如果“最短时间内的大量文本”,Perl和Python不是答案。但是如果你需要掀起一些不太慢的东西,并且可以花更长的时间,那么Perl和Python就可以了。兆兆字节的数量实际上并不大。

答案 8 :(得分:1)

Perl适用于文本处理。

Perl编写了许多非常好的文本处理程序。 Ack(一个grep替代品)是一个。

答案 9 :(得分:0)

听起来像是Perl的工作,就像我自己并不特别关心它一样。 ActivePerl是适用于Windows的Perl的合理分发。

答案 10 :(得分:0)

我建议Perl。它实际上是为解析日志文件而构建的。至于输出我同意ghostdog74,HTML是要走的路。 Perl有许多模块,允许您构建和/或模板化HTML。

我使用正则表达式解析数据,然后使用Template :: Toolkit(在CPAN上)使用HTML和CSS模板创建漂亮的页面。

答案 11 :(得分:-2)

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,因为没有检查类型等,它可能导致错误。 但我认为这非常有效。