我有一个文本文件(大小为7GB +),其中包含重复的行,如下所示,其中10.00和2.00可能与每一行不同:
startline money earned 10.00 "300 plus nums n words here" money start 2.00 more words我想得到10.00和2.00的值
我的正则表达式如下所示:
money earned ([0-9\.]+).*money start ([0-9\.]+)但这是荒谬的低效。我花了将近30分钟来扫描1%的文本文件!.*似乎是造成这种低效率的原因。因此,我选择了通过使用2条单独的regex行来获得这些值,如下所示,这同样有效,而且效率要高得多。
money earned ([0-9\.]+) //this is line 1 capturing 10.00
money start ([0-9\.]+) //this is line 2 capturing 2.00但这会导致挣来的钱(10.00)首先被捕获,因为它是每行的第一部分,而money start (2.00)则是第二位。
我想要扭转这一点,并能够捕获货币开始(2.00)的每一行和钱赚(10.00)作为第二。有什么办法,我可以扭转的正则表达式,从后面的线,并移动到前面。或者,无论如何,当我用一行正则表达式进行扫描时,我可以克服效率低下的问题吗?
发布于 2016-07-15 06:41:11
在java程序接管之前,您能够预处理您的文件吗?
我使用示例作为模板创建了一个7.1GB文件。然后,我使用grep对其进行预处理,以创建一个中间文件,然后java可以更容易地处理该文件。
time grep -Eo 'money (earned|start) \d+\.\d+' large_file.txt > results.txt
real 3m12.306s
user 3m7.701s
sys 0m3.222sresults.txt文件仅需三分钟即可创建,只有168米,格式为:
money earned 10.00
money start 2.00
money earned 10.00
money start 2.00
money earned 10.00
money start 2.00发布于 2016-07-15 06:54:49
money earned ([0-9\.]+).*money start ([0-9\.]+)
^^这是你的问题。这是一场贪婪的比赛。这意味着它在回溯之前尽可能多地开始匹配,并尝试较短的匹配以允许其余的正则表达式匹配。因此,如果您有大量的数据,或者很长的行(甚至是很长的字符串,这取决于.是否匹配换行),这可能需要一段时间。这也在一定程度上取决于数据的外观。如果在上一次money start之后出现了大量文本,那么需要花费更长的时间。如果行中有多个money start,则跳过除最后一个之外的所有内容。
您可以尝试使用.*?,这是一个懒惰的匹配,也就是说,它从尽可能少的开始并扩展它。在许多情况下,这要快得多。
https://stackoverflow.com/questions/38384304
复制相似问题