我公司的专有软件会生成一个日志文件,如果解析它会更容易使用。我们都使用的日志解析器是由另一个员工编写的一个副项目,它的性能很糟糕。
这些日志文件可以非常快速地增长到10兆字节,如果日志文件大于1兆字节,我们当前使用的解析器会出现问题。
所以,我想编写一个程序,可以在最短的时间内解析大量的文本。我们专门使用Windows,因此必须在Windows上运行。我们当前的实现在本地Web服务器上运行,我确信将其作为应用程序运行必须更快。
所有建议都会有所帮助。感谢。
编辑:我的最终目标是解析文本并以更加用户友好的方式显示颜色等。你能用Perl和Python做到这一点吗?我知道你可以用Java和C ++做到这一点。因此,它将像记事本一样打开日志文件,但在屏幕上显示用户友好的格式而不是原始文件。
编辑:所以,我无法选择最佳答案,那就是选择一种能够最好地展示我的目标的语言,然后在其中编写解析器。此外,使用ANTLR可能会使此过程更容易。我改变了原来的问题,因为我想我没有问我到底在想什么。谢谢大家!
答案 0 :(得分:16)
如果它变得有点复杂,为什么不使用正确的语法和语法设置?
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 LogParser(usage 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,因为没有检查类型等,它可能导致错误。 但我认为这非常有效。