Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.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
C++ 在C++;_C++_Parsing_Logging_Text Parsing - Fatal编程技术网

C++ 在C++;

C++ 在C++;,c++,parsing,logging,text-parsing,C++,Parsing,Logging,Text Parsing,我有一组庞大的日志行,我需要解析每一行(以提高效率) 这是非常重要的) 每个日志行的格式如下 客户名称时间开始时间结束(IP或URL)* 所以ip地址、时间、时间和可能为空的ip地址或URL列表用分号分隔。如果最后一个列表中只有ip或url,则没有分隔符。如果有 大于1,则用分号分隔 我需要一种方法来解析这一行并将其读入数据结构。开始或结束的时间 时间结束可以是系统时间或GMT。客户名称也可以有多个字符串 用空格隔开 我可以通过逐字阅读并编写自己的解析器来实现这一点。 有更好的方法吗?自定义输入

我有一组庞大的日志行,我需要解析每一行(以提高效率) 这是非常重要的)

每个日志行的格式如下

客户名称时间开始时间结束(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> 这里真正需要的效率不是解析代码的“机器代码”级别的性能,而是整个算法级别的性能

想想你想做什么。
你有一个巨大的文本文件,你想把每一行转换成一个数据结构

无论您使用哪种语言,在内存中存储巨大的数据结构都是非常低效的

您需要做的是一次“提取”一行,将其转换为数据结构,并对其进行处理,然后,只有在处理完数据结构后,您才能继续提取下一行,并将其转换为数据结构,对其进行处理,然后重复

如果