寻找反转sprintf()函数输出的算法

5 algorithm logging printf parsing normalizing

我正在开发一个需要解析日志文件的项目.我正在寻找一个快速的算法,将采取像这样的组消息:

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)}
Run Code Online (Sandbox Code Playgroud)

该算法需要足够通用以识别消息组中的几乎任何数据负载.

我尝试搜索这种技术,但我甚至不知道要搜索的正确术语.

Joh*_*ney 12

我想你可能会忽视并错过了fscanf()和sscanf().这与fprintf()和sprintf()相反.


小智 6

概述:

一个天真!算法以每列方式跟踪单词的频率,其中可以假设每行可以用分隔符分隔成列.

输入示例:

狗跳过月亮
猫跳过月亮
月亮跳过月亮
汽车跳过月亮

频率:

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}
Run Code Online (Sandbox Code Playgroud)

我们可以通过基于字段总数的分组来进一步划分这些频率列表,但是在这个简单方便的示例中,我们只使用固定数量的字段(6).

下一步是迭代生成这些频率列表的行,让我们来看第一个例子.

  1. :符合有些手波浪标准和算法决定它必须是静态的.
  2. dog:基于频率列表的其余部分似乎不是静态的,因此它必须是动态的而不是静态文本.我们遍历一些预定义的正则表达式并提出/[a-z]+/i.
  3. 结束:与#1相同的交易; 它是静态的,所以保持原样.
  4. :同一交易#1; 它是静态的,所以保持原样.
  5. 月亮:与#1相同的交易; 它是静态的,所以保持原样.

因此,只需从第一行开始,我们就可以将以下正则表达式组合在一起:

/The ([a-z]+?) jumps over the moon/
Run Code Online (Sandbox Code Playgroud)

注意事项:

  • 显然,只要有人确信频率列表是对整个数据的充分采样,就可以选择扫描第一遍的部分或整个文档.

  • 误报可能会蔓延到结果中,并且将取决于过滤算法(挥手)以提供静态和动态字段之间的最佳阈值,或者某些人类后处理.

  • 总体思路可能很好,但实际实施肯定会影响该算法的速度和效率.