当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《寻找反转sprintf()函数输出的算法》经验,为你挑选了2个好方法。

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

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)}

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

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



1> John Downey..:

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



2> 小智..:

概述:

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

输入示例:

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

频率:

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/

注意事项:

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

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

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

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有