Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实时解析大型文本文件(Java)_Java_Regex_Parsing - Fatal编程技术网

实时解析大型文本文件(Java)

实时解析大型文本文件(Java),java,regex,parsing,Java,Regex,Parsing,我对用Java(1.6.x)解析一个相当大的文本文件感兴趣,并且想知道哪种方法被认为是最佳实践 该文件的大小可能约为1Mb,并将由沿以下行的数千个条目组成: Entry { property1=value1 property2=value2 ... } 等等 我的第一直觉是使用正则表达式,但我之前没有在生产环境中使用Java的经验,因此我不确定Java.util.regex类的功能有多强大 为了澄清一点,我的应用程序将是一个web应用程序(JSP),它解析有问题的文件并

我对用Java(1.6.x)解析一个相当大的文本文件感兴趣,并且想知道哪种方法被认为是最佳实践

该文件的大小可能约为1Mb,并将由沿以下行的数千个条目组成:

Entry
{
    property1=value1
    property2=value2
    ...
}
等等

我的第一直觉是使用正则表达式,但我之前没有在生产环境中使用Java的经验,因此我不确定Java.util.regex类的功能有多强大

为了澄清一点,我的应用程序将是一个web应用程序(JSP),它解析有问题的文件并显示它检索到的各种值。只有一个文件被解析(它位于主机上的第三方目录中)

该应用程序的使用率相当低(可能只有少数用户一天使用几次),但至关重要的是,当他们使用它时,信息会被尽快检索

此外,在每次解析文件时都将其加载到内存中,是否有任何预防措施

有人能推荐一种方法吗


谢谢

如果语法正确,请使用解析器生成器,如。这允许您指定格式并使用高效的解析器来获取所需的令牌,几乎可以免费获得错误处理。

我想知道为什么这不是XML格式,然后您可以利用可用的XML工具。我特别想到SAX,在这种情况下,您可以轻松地解析/处理它,而无需将其全部保存在内存中

那么您可以将其转换为XML吗


如果您不能,并且您需要一个解析器,那么请查看使用Scanner类并一次处理一行文件。我不知道你为什么提到正则表达式。对于任何解析问题,Regex几乎从来都不是正确的答案,因为它的模糊性和对在什么上下文中发生的事情缺乏对称控制。

您可以使用解析器生成器构建能够解析文件的解析器。

不回答有关解析的问题。。。但是您可以解析文件,并在新文件到达时生成静态页面。这样您就不会有性能问题。。。(我认为1MB不是一个大文件,所以你可以把它加载到内存中,只要你不同时加载太多的文件…)

< P>这看起来是一个简单的文件格式,所以你可以考虑使用A。与JavaCC和Antlr相比,它的优点是您可以编写一些简单的方法,获得所需的数据,并且不需要学习解析器生成器形式。
它的缺点是效率可能会降低。递归下降解析器原则上比正则表达式更强大。如果你能想出这种文件类型的语法,它将为你提供你选择的任何解决方案。

如果它将是1MB左右,并且按照你所说的格式,那么听起来你在过度设计

除非您的服务器是ZX频谱或其他什么,否则只需使用正则表达式对其进行解析,在散列映射中对数据进行重击(并将其保留在那里),就不用担心了。它会占用几兆的内存,但那又怎样


更新:为了让您具体了解性能,我对的一些测量(使用正则表达式)表明,在2GHz机器上,拆分10000个100个字符串需要毫秒(换句话说,大约1兆字节的数据——实际上在纯字节量中更接近2MB,因为字符串是每个字符2个字节)显然,这不是你正在执行的操作,但你明白我的意思:事情并没有那么糟糕…

如果你想知道的是Java正则表达式的局限性,那就不用担心了。假设你在编写正则表达式方面有相当的能力,性能应该不会有问题。功能集也非常丰富,包括另一种解决方案是进行某种形式的预处理(离线完成,或作为cron作业),这将产生一个非常优化的数据结构,然后用于服务许多web请求(无需重新分析文件)


尽管如此,从所讨论的场景来看,这似乎并不需要。

这是一个第三方日志文件,不幸的是,我无法控制格式。你是指实时还是快速?两者非常不同。实时意味着你在不等待更多输入的情况下返回每个输入的答案。这通常比批量pr慢处理。此外,1兆不再被认为是大的,除非你在内存少于64兆的机器上运行。我的意思是快速-我希望一个请求从web UI发送到服务器,这将表明它应该解析文件并返回结果(到任何适当的数据结构中)然后处理它们以在UI中显示。一直在解析的都是同一个文件-编辑帖子以澄清这一点。公平的说-这实际上也是我想知道的-如果我在头脑中对这个问题过于敏感。我想我会照你说的做,看看我是怎么做的。如果性能成为一个问题,那么我可以继续e回头看看其他答案建议的选项。干杯。我真的不认为会是这样——1MB真的不是很多数据。请告诉我们正则表达式有多含糊。是的,不同的口味表现不同,但它们都是(或多或少)记录和一致。对于给定的味道,每个表达式都有精确和明确的含义。当它们(正则表达式)变得复杂他们不会做人们认为他们实际上在做的事情。真正的解析问题和解决方案从不使用RegExs。有没有用RegExs编写的编译器?@mP。当人们不倾向于清楚地理解某件事情时,他们通常将其称为“模棱两可”;只需花点时间理解它,这会大大减少工作量…@mP说“真正的解析问题永远不会使用RegExs…使用Scanner类”很讽刺,因为Scanner类