【问题标题】:Comparing values in txt file比较txt文件中的值
【发布时间】:2021-08-24 07:29:07
【问题描述】:

好的,所以我有一个 txt 文件,其中包含来自电气单元的消息。

那是消息表单:

ID  time(ms)     EU ID      Val1   Val2
1      0          0x100      0       0 

下面是 txt 文件的几行:

1 0 0x200 0 0
2 0 0x100 0 0
3 0 0x400 0 0
4 0 0x800 0 100
5 5 0x200 0 11

我想验证,例如,单元 0x100 每 50 毫秒发送一条消息。

所以遍历这个 txt 文件我确实采取了接下来的步骤:

def detect_timing_anomalies():
    with open('100.txt') as file:
        times_anomalies = file.readlines()
        msgs = [msg for msg in times_anomalies]
        msgs = list(map(lambda msg: list(msg.split(" ")), msgs))
        for i in range(0, len(msgs)):
            list_0x100 = []
            if msgs[i][2] == "0x100":
                print(msgs[i])

现在我面临一个问题,即如何实际比较单元 0x100 接收到的每个 msg,并查看每个消息之间的时间差是否恰好为 50 毫秒,如果不保存该 msg 的 ID(行)在异常的 id 列表中。

【问题讨论】:

    标签: python python-3.x anomaly-detection


    【解决方案1】:

    这是一个例子:

    def detect_timing_anomalies():
        with open('file.txt') as file:
            lines = file.readlines()
            messages = [msg.rstrip().split(' ') for msg in lines]
    
            expected_time_intervals = {'0x100': 50, '0x200': 50, '0x400': 50, '0x800': 50}
            previous_timings = {}
            anomalies = []
    
            for message in messages:
                message_id = int(message[0])
                message_time = int(message[1])
                message_unit = message[2]
    
                previous_timing = previous_timings.get(message_unit)
                expected_time_interval = expected_time_intervals.get(message_unit)
    
                if previous_timing != None and message_time - previous_timing != expected_time_interval:
                    anomalies.append(message_id)
                
                previous_timings[message_unit] = message_time
    
        return anomalies
    

    【讨论】:

      【解决方案2】:

      我认为一种简单的开始方式应该尽可能快速和简单:

      times = [msg.split()[1] for msg in open('100.txt') if '0x100' in msg]
      import numpy as np
      d = np.array(times).diff()
      print(d[d!=50])
      

      然后从那里改进。 GL!

      【讨论】: