C++ 在C++;
我有一组庞大的日志行,我需要解析每一行(以提高效率) 这是非常重要的) 每个日志行的格式如下 客户名称时间开始时间结束(IP或URL)* 所以ip地址、时间、时间和可能为空的ip地址或URL列表用分号分隔。如果最后一个列表中只有ip或url,则没有分隔符。如果有 大于1,则用分号分隔 我需要一种方法来解析这一行并将其读入数据结构。开始或结束的时间 时间结束可以是系统时间或GMT。客户名称也可以有多个字符串 用空格隔开 我可以通过逐字阅读并编写自己的解析器来实现这一点。C++ 在C++;,c++,parsing,logging,text-parsing,C++,Parsing,Logging,Text Parsing,我有一组庞大的日志行,我需要解析每一行(以提高效率) 这是非常重要的) 每个日志行的格式如下 客户名称时间开始时间结束(IP或URL)* 所以ip地址、时间、时间和可能为空的ip地址或URL列表用分号分隔。如果最后一个列表中只有ip或url,则没有分隔符。如果有 大于1,则用分号分隔 我需要一种方法来解析这一行并将其读入数据结构。开始或结束的时间 时间结束可以是系统时间或GMT。客户名称也可以有多个字符串 用空格隔开 我可以通过逐字阅读并编写自己的解析器来实现这一点。 有更好的方法吗?自定义输入
有更好的方法吗?自定义输入需要自定义解析器。或者,祈祷有一个理想的世界,错误不存在。特别是,如果你想有效率。发布一些代码可能会有所帮助。自定义输入需要自定义解析器。或者,祈祷有一个理想的世界,错误不存在。特别是,如果你想有效率。发布一些代码可能会有帮助。 < P>可以尝试使用一个简单的Lex/YACC Flex/BISY词汇来解析这种输入。 < P>可以尝试使用一个简单的Lex/YACC Flex/BISY词汇来解析这种输入。
考虑使用……/P>< P>考虑使用…
< P>为什么在C++中要这样做?这听起来像Perl一样的一个明显的工作。 < P>为什么你想在C++中这样做?对于perl之类的东西来说,这似乎是一项显而易见的工作。也许Boost RegExp lib会对您有所帮助。也许Boost RegExp lib会对您有所帮助。
我在这方面做得很成功。它可以帮助您使用自定义分隔符将输入流拆分为令牌。我已经成功地完成了这类工作。它可以帮助您使用自定义分隔符将输入流拆分为令牌。对于可以使用split的简单语法,请查看对于可以使用split的简单语法,请查看使用正则表达式的(
boost::regex
是C++的一个很好的实现)您可以轻松地将字符串的不同部分分隔开来-cust\u name、time\u start…
并找到所有URL\IP
第二步是在需要时对该组进行更详细的解析。例如,您可以使用boost::datetime
库解析日期(如果字符串格式不标准,则编写自定义解析器)。使用正则表达式(boost::regex
是C++的一个很好的实现)您可以轻松地分离字符串的不同部分-cust\u name,时间开始…
并查找所有URL\IP
第二步是在需要时对该组进行更详细的解析。例如,您可以使用
boost::datetime
库解析日期(如果字符串格式不是标准格式,则编写自定义解析器)。更新彻底更改了答案
我有大量的日志行,需要解析每一行(因此效率非常重要)
<> >请注意,C++在这种情况下对效率的帮助不大。不要被愚弄以为只是因为你有一个快速解析代码在C++中你的程序将有很高的性能!p>
这里真正需要的效率不是解析代码的“机器代码”级别的性能,而是整个算法级别的性能
想想你想做什么。你有一个巨大的文本文件,你想把每一行转换成一个数据结构 无论您使用哪种语言,在内存中存储巨大的数据结构都是非常低效的 您需要做的是一次“提取”一行,将其转换为数据结构,并对其进行处理,然后,只有在处理完数据结构后,您才能继续提取下一行,并将其转换为数据结构,对其进行处理,然后重复 如果你这样做,你已经解决了主要的瓶颈 对于文本行的解析,您的数据格式似乎非常简单,请查看我刚才问的一个类似问题: 在您的情况下,我想您可以使用字符串流,并使用
>
操作符来读取行中的下一个“thing”
参见示例代码
或者,(我不想删除这个部分!!)
如果您可以用python编写,它会简单得多。我不知道你的情况(看起来你被C++困住了),但是
请看本演示文稿,了解如何使用python生成器表达式高效地执行这类任务:
这本书值得一读。
在第31张幻灯片中,他讲述了与您尝试做的事情非常相似的事情
它至少会给你一些灵感。它还非常有力地证明了性能不是通过特定的字符串解析代码获得的,而是通过整体算法获得的。更新彻底改变了答案 我有大量的日志行,需要解析每一行(因此效率非常重要) <> >请注意,C++在这种情况下对效率的帮助不大。不要被愚弄以为只是因为你有一个快速解析代码在C++中你的程序将有很高的性能!p> 这里真正需要的效率不是解析代码的“机器代码”级别的性能,而是整个算法级别的性能 想想你想做什么。
你有一个巨大的文本文件,你想把每一行转换成一个数据结构 无论您使用哪种语言,在内存中存储巨大的数据结构都是非常低效的 您需要做的是一次“提取”一行,将其转换为数据结构,并对其进行处理,然后,只有在处理完数据结构后,您才能继续提取下一行,并将其转换为数据结构,对其进行处理,然后重复 如果