我正在开发一个需要解析日志文件的项目.我正在寻找一个快速的算法,将采取像这样的组消息:
P1的温度为35°F.
P1的温度为40°F.
P3的温度为35F.
记录器停了下来.
记录器开始了.
P1的温度为40°F.
并以printf()的形式提出一些东西:
"The temperature at P%d is %dF.", Int1, Int2" {(1,35), (1, 40), (3, 35), (1,40)}
该算法需要足够通用以识别消息组中的几乎任何数据负载.
我尝试搜索这种技术,但我甚至不知道要搜索的正确术语.
我想你可能会忽视并错过了fscanf()和sscanf().这与fprintf()和sprintf()相反.
概述:
一个天真!算法以每列方式跟踪单词的频率,其中可以假设每行可以用分隔符分隔成列.
输入示例:
狗跳过月亮
猫跳过月亮
月亮跳过月亮
汽车跳过月亮
频率:
Column 1: {The: 4} Column 2: {car: 1, cat: 1, dog: 1, moon: 1} Column 3: {jumped: 4} Column 4: {over: 4} Column 5: {the: 4} Column 6: {moon: 4}
我们可以通过基于字段总数的分组来进一步划分这些频率列表,但是在这个简单方便的示例中,我们只使用固定数量的字段(6).
下一步是迭代生成这些频率列表的行,让我们来看第一个例子.
的:符合有些手波浪标准和算法决定它必须是静态的.
dog:基于频率列表的其余部分似乎不是静态的,因此它必须是动态的而不是静态文本.我们遍历一些预定义的正则表达式并提出/[a-z]+/i
.
结束:与#1相同的交易; 它是静态的,所以保持原样.
的:同一交易#1; 它是静态的,所以保持原样.
月亮:与#1相同的交易; 它是静态的,所以保持原样.
因此,只需从第一行开始,我们就可以将以下正则表达式组合在一起:
/The ([a-z]+?) jumps over the moon/
注意事项:
显然,只要有人确信频率列表是对整个数据的充分采样,就可以选择扫描第一遍的部分或整个文档.
误报可能会蔓延到结果中,并且将取决于过滤算法(挥手)以提供静态和动态字段之间的最佳阈值,或者某些人类后处理.
总体思路可能很好,但实际实施肯定会影响该算法的速度和效率.