我有一大堆日志行,我需要解析每一行(所以效率 非常重要)。

每个日志行的格式为

cust_name time_start time_end(IP或URL)*

所以ip地址,时间,时间以及用分号分隔的ip地址或URL的可能空列表。如果最后一个列表中只有ip或url,则没有分隔符。如果有 超过1,然后用分号分隔。

我需要一种方法来解析这一行并将其读入数据结构。 time_start或 time_end可以是系统时间或GMT。 cust_name也可以有多个字符串 用空格分隔。

我可以通过逐字符阅读并基本上编写自己的解析器来实现。 有更好的方法吗?

有帮助吗?

其他提示

我已成功使用 Boost Tokenizer 对于这种事情。它可以帮助您在令牌之间使用自定义分隔符将输入流分解为令牌。

使用正则表达式( boost :: regex 是一个很好的C ++实现),您可以轻松地分离字符串的不同部分 - cust_name,time_start ... 并查找所有的网址\ ips

如果需要,第二步是更详细地解析这些组。例如,您可以使用 boost :: datetime 库进行解析(如果字符串格式不是标准的话,则编写自定义解析器)。

为什么要在C ++中执行此操作?对于像perl这样的东西来说,这听起来很明显。

考虑使用正则表达式库 ...

自定义输入需要自定义解析器。或者,祈祷有一个理想的世界,并且不存在错误。特别是,如果你想要有效率。发布一些代码可能会有所帮助。

对于这样一个简单的语法你可以使用split,看看 http://www.boost.org/doc/libs/1_38_0/doc/html/string_algo/usage.html#id4002194

更新彻底改变了答案!

  

我有一大堆日志行,我需要解析每一行(因此效率非常重要)。

请注意,在这种情况下,C ++在效率方面无济于事。不要误以为只是因为你在C ++中使用快速解析代码才能使你的程序具有高性能!

这里你真正需要的效率不是“机器代码”的性能。解析代码的级别,但是在整个算法级别。

想想你想要做什么。
您有一个巨大的文本文件,并且您希望将每一行转换为数据结构,

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

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

如果你这样做,你已经解决了主要的瓶颈。

为解析文本行,您的数据格式似乎相当简单,请查看我前一段时间提出的类似问题: C ++字符串解析(python样式)

在您的情况下,我想您可以使用字符串流,并使用>> 运算符来阅读下一个“事物”。在线。

请参阅此答案以获取示例代码。

或者,(我不想删除这部分!!) 如果你能在python中写这个,那就简单多了。我不知道你的情况(似乎你被C ++困住了),但仍然是

使用python生成器表达式查看此演示文稿以高效地执行这些任务: http:/ /www.dabeaz.com/generators/Generators.pdf

这是值得一读的。 在幻灯片31中,他处理的内容似乎与您尝试的内容非常相似。

它至少会给你一些灵感。
它还非常强烈地证明了性能不是通过特定的字符串解析代码获得的,而是通过所有算法获得的。

您可以尝试使用简单的lex / yacc | flex / bison词汇表来解析此类输入。

你需要的解析器听起来非常简单。 看看这个。任何编译语言应该能够解析它非常高的速度。那么这就是你构建的数据结构的问题。保存。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top