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

Algorithm 查找反转sprintf()函数输出的算法,algorithm,parsing,logging,printf,normalizing,Algorithm,Parsing,Logging,Printf,Normalizing,我正在处理一个需要解析日志文件的项目。我正在寻找一种快速算法,它可以接收如下组消息: P1处的温度为35华氏度 P1处的温度为40华氏度 P3处的温度为35华氏度 记录器停止 记录器启动 P1处的温度为40华氏度 并以printf()的形式输出某些内容: 该算法需要足够通用,以识别消息组中几乎所有的数据负载 我试着搜索这种技术,但我甚至不知道要搜索的正确术语。我想你可能忽略了并错过了fscanf()和sscanf()。这与fprintf()和sprintf()相反。这取决于您试图做什么,如果您的

我正在处理一个需要解析日志文件的项目。我正在寻找一种快速算法,它可以接收如下组消息:

P1处的温度为35华氏度

P1处的温度为40华氏度

P3处的温度为35华氏度

记录器停止

记录器启动

P1处的温度为40华氏度

并以printf()的形式输出某些内容:

该算法需要足够通用,以识别消息组中几乎所有的数据负载


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

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

这取决于您试图做什么,如果您的目标是快速生成sprintf()输入,那么这是可行的。如果您试图解析数据,可能正则表达式也可以

@John:我认为这个问题与一种算法有关,该算法能够识别日志文件中的模式,并自动“猜测”相应的格式字符串和数据。
*scanf
系列本身无法做到这一点,只有在模式首先被识别后,它才能起到帮助作用。

你不会找到一种工具,它可以简单地接受任意输入,猜测你想要的数据,并产生你想要的输出。对我来说,这听起来像是很强的人工智能

制作这样的东西,即使只是为了识别数字,也会让人毛骨悚然。例如,“123.456”是一个数字还是两个?这个“123456”怎么样?“35F”是十进制数和“F”还是十六进制值0x35F?您必须构建一些能够以您需要的方式进行解析的东西。您可以使用正则表达式来实现这一点,也可以使用
sscanf
来实现这一点,或者您可以使用其他方式来实现这一点,但您必须编写一些自定义的内容

但是,使用基本正则表达式,您可以自己执行此操作。这不会有什么魔力,但也不会有那么多工作。类似的内容将解析您感兴趣的行并将其合并(Perl):


您可以对需要解析的每种类型的行执行类似的操作。您甚至可以从文件中读取这些正则表达式,而不是对每个正则表达式进行自定义编码。

感谢您提出的所有建议。 克里斯,是的。我正在寻找一个通用的解决方案来规范任何类型的文本。问题的解决方案归结为在两个或多个相似字符串中动态查找模式。 几乎就像根据前两个预测集合中的下一个元素一样:

1:珠穆朗玛峰有30000英尺高

2:K2高28000英尺

=>模式是什么? =>答案:

[姓名]有[数字]英尺高

现在文本文件可以有数百万行和数千个模式。我想非常非常快速地解析文件,找到模式并收集与每个模式相关联的数据集

我考虑创建一些高级语义哈希来表示消息字符串中的模式。 我会使用一个标记器,并给每个标记类型一个特定的“权重”。 然后我将对散列进行分组,并对它们的相似性进行评级。分组完成后,我将收集数据集

我希望,我不必重新发明轮子,可以重复使用已经存在的东西


克劳斯

我不知道有什么具体的工具可以做到这一点。当我有一个类似的问题要解决时,我所做的是尝试猜测正则表达式以匹配行

然后我处理了文件,只显示了不匹配的行。如果一条线不匹配,则表示该图案错误,应进行调整或添加其他图案

经过大约一个小时的工作,我成功地找到了约20个模式,以匹配10000多行

在您的例子中,您可以首先“猜测”一种模式是
“p[1-3]处的温度是[0-9]{2}F.”
。如果重新处理文件并删除任何匹配的行,则会留下“仅”:

记录器停止

记录器启动

然后可以将其与
“记录器(+)。”
匹配

然后,您可以优化模式并找到与整个日志匹配的新模式。

概述:

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

输入示例:

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

频率:

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相同的交易;它是静态的,所以保持原样
  • moon:与#1相同;它是静态的,所以保持原样
  • 因此,仅从第一行开始,我们就可以组合以下正则表达式:

    /The ([a-z]+?) jumps over the moon/
    
    考虑事项:

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

    • 假阳性可能潜入结果中,而且它会
      The temperature at P%d is %dF. {(1,35),(1,40),(3,35),(1,40)}
      
      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}
      
      /The ([a-z]+?) jumps over the moon/