通过CANOE 导出的log通常有很多个ID的数据,如何才能找到某一个ID下的特殊的信号?利用python可以简单的进行这个步骤,代码如下:

说明:

  最终的效果是将log信息,分不同的ID进行拆分,并单独生成文件log_id.csv的文件夹。

  1. 需要输入输入文件夹

  2. 生成_out文件夹。

  3. 没有错误处理

  4. 采用"[A-F|\d]{3}"匹配CAN ID

 #log analy about CAN Signal for CANOE
import os
import re ID_Info = {}
fold_in = input("Please input Folder In:")
fold_out = fold_in + "_out"
os.mkdir(fold_out)
rep_id = r"[A-F|\d]{3}"
patt_id = re.compile(rep_id)
def Info_Report():
'''
CAN Log中的信息有固定的位数。
0:时间戳
1:1/2
2:ID
3:Rx/Tx
4: d
5: data Length
6: data length number info
'''
pass def Dev_Folder(folder_in):
for fi in os.listdir(folder_in):
#打开文件
with open(os.path.join(folder_in,fi),"r") as file:
#遍历文件行
for line in file:
#拆分文件,去掉空格,去掉前后逗号
a = re.sub('\s+',',',line).strip(",")
#判断List是否有3个以上的元素,并且第3个是否为ID.
if len(a.split(",")) > 2 and patt_id.match(a.split(",")[2]):
if a.split(",")[2] in ID_Info.keys():
#如果在字典中,直接将信息写入到该文件中
pass
else:
#新建一个文件,关联字典
ID_Info[a.split(",")[2]] = open((os.path.join(fold_out + "\\" + "Log_" + a.split(",")[2]) + ".csv"),"w")
ID_Info[a.split(",")[2]].write(a+"\n")
#print(a.split(",")[0])
for key in ID_Info:
ID_Info[key].close() if __name__ == '__main__':
Dev_Folder(fold_in)

以上拆分为单个的ID了,那么如何找到某一个信号的值呢?可以通过下面的代码进行计算:

 '''
CANOE Log
'''
''' '''
start_bit = 0
data_length = 0
can_mode = 0 def Info_Report():
'''
Need Input This information about CAN setting.
start bit: start_bit
Length : Data_Length
start bit mode : LSB(0)/MSB(1)
default:LSB(0)
'''
pass def SetBit(start,length,mode = 0):
'''
for Get Info or set info
'''
start_bit = start
data_length = length
can_mode = mode def Analyse_ID_File(File_Input_Name,File_Output_Name):
'''
Analyse id for Every ID Signal
'''
#open file
file_out = open(File_Output_Name,"w")
with open(File_Input_Name,"r") as file:
for line in file:
#拆分每一行,放入到list中
data_list = line.split(",")
data_length = int(data_list[5],16)
list_in = data_list[6:6+data_length]
data_signal = Find_FromList(list_in)
file_out.write(data_list[0]+","+str(data_signal)+"\n")
file_out.close() def Find_FromList(data_list):
dataMerge = ''
a,b,c = Find_StartEnd(start_bit,data_length,can_mode)
#print(data_list)
if len(data_list) > b:
for i in range(a,b+1):
#print(i)
dataMerge = dataMerge + data_list[i]
#print(dataMerge)
data_Digit = (int(dataMerge,16)>>c) & ((1<<(data_length))-1)
return (data_Digit)
#print(dataMerge) def Find_StartEnd(start,length,mode):
'''
This Function return value:
byte_little,byte_big,bigbyte_bit
'''
startbyte = start >> 3
startbit = start % 8
if mode == 0:
litByte = startbyte - ((startbit+length-1)>>3)
BigByte = startbyte
Endbit = startbit
else:
pass
return (litByte,BigByte,Endbit) if __name__ == '__main__':
#print(Find_StartEnd(32,20,1))
file_name = input("Please input file You need Analyse:")
file_out_name = input("Please input file You need Out(.csv):")
start_bit,data_length,can_mode = map(int,input("please input can info(start_bit,data_length,can_mode(0/1),PV为0):").split(","))
Analyse_ID_File(file_name,file_out_name)

以上,如果不通过导入每个信号信息含义的话,是可以快速的找到某个信号在整个log中的值得变化的。

  以上,只支持以LSB开始,计算长度的算法。如果以MSB需要在''Find_StartEnd"函数中增加''mode == 1''的处理。

python拆分CANLog的更多相关文章

  1. python拆分excel脚本

    因为需要将一个很大的excel按500条拆分为多个excel,手工操作实在太麻烦,就写了个python小脚本,现在是分为了多个sheet页,使用者可根据自己实际情况修改成多个文件的形式 #!/usr/ ...

  2. Python 拆分字符串

    数:split() Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list ...

  3. Python拆分DataFrame

    # 在Python中可以根据某列的具体内容来拆分数据,保存成多个DataFrame! # 代码如下: ycsj = pfsj[pfsj['备注'].isin(['1'])] # 拆分数据: 结果:

  4. 使用Python拆分数据量大的CSV文件(亲测有效)

    转载:https://www.cnblogs.com/FYZHANG/p/11629075.html 一次就运行成功了,感谢博主分享 #!/usr/bin/env python3 # -*- # @F ...

  5. python 拆分字符串(3.0)

    拆分字符串 1. def my_split(s, ds): l = [s] for d in ds: res = [] list(map(lambda x: res.extend(x.split(d) ...

  6. Python拆分一列为多列

    有的员工,没有公司开户行的银行卡,发放现金工资.有时人多,需要计算币数.现金工资表中,其中一列为实发工资,import pandas as pd,转化为pd.DataFrame. 面值[100,50, ...

  7. python 奇偶拆分list,python拆分list,得到一个原来list的奇数list,一个原来list的偶数list

    需求:现在有一个list ,range_data = ['m', 'M', 'h', 'c', 'X', 'Z', 'A', 'o'] 希望得到两个list,  一个是奇数list =['m', 'h ...

  8. python 小程序大文件的拆分合并

    1. 将大文件拆分为小文件 I 通过二进制的方式将大文件读取出来,将其拆分存,以不同的文件方式存放在一个目录下面 II 提供两种操作方式交互式和命令行模式 #! usr/bin/python # -* ...

  9. python split()函数使用拆分字符串 将字符串转化为列表

    函数:split()Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list ...

随机推荐

  1. 解读ASP.NET 5 & MVC6系列(9):日志框架

    框架介绍 在之前的.NET中,微软还没有提供过像样的日志框架,目前能用的一些框架比如Log4Net.NLog.CommonLogging使用起来多多少少都有些费劲,和java的SLF4J根本无法相比. ...

  2. Codeforces Round #382(div 2)

    A.= = B. 题意:给出n个数和n1和n2,从n个数中分别选出n1,n2个数来,得到n1个数和n2个数的平均值,求这两个平均值的最大和 分析:排个序从后面抽,注意先从末尾抽个数小的,再抽个数大的 ...

  3. ActiveMQ安全配置

    1.activeMQ管理后台用户名.密码的设置 管理后台地址http://localhost:8161/admin 默认用户名密码admin admin 端口默认是8161,且服务采用的是服务器,所以 ...

  4. Django中 如何修改models字段的默认值

    场景描述: 在建表的时候,新闻表的内容简介字段,给的默认值是可以为空的,但是没有设置默认值为blank,那么,这种情况下,对于只有标题,没有内容简介的新闻来讲,发布之后,前端显示的内容简介位置是non ...

  5. crodova打包apk个人总结

    1.安装nodejs 2.安装 cordova npm install -g cordova 3.安装Java JDK,官网下载地址 系统变量→新建 JAVA_HOME 变量 . 变量值填写jdk的安 ...

  6. UVA232

    这只是大概的雏形. 步骤就是:1输入网格,2给网格里的起始格编序号,3输出所有字母,前面要加序号 #include<stdio.h> #include<ctype.h> #in ...

  7. 关闭SELinux和iptables防火墙

    1.关闭SELinux: 编辑SELinux配置文件: [root@Redis selinux]# vim /etc/selinux/config 修改SELINUX配置项为disable SELIN ...

  8. 【技巧】为ComboBox添加自动提示

    一.需求来源 最近有个项目用到了ComboBox控件,在演示的时候,要对Word文档中选中部分添加符合DocBook标准的标签,这些标签是DocBook中元素的集合,数据量不多,大概170多个吧,但是 ...

  9. mysql主从复制操作步骤

    注: .做主从复制的两台服务器server-id不能相同 .主从的字符集要一样,不然数据导入会报错 .开启db01的log-bin功能 [root@db01 mysql]# vim /etc/my.c ...

  10. SQL语句/函数汇总

    1.CHARINDEX(短字符A,长字符B) 说明:返回A在B的位置,从1开始,若B中不存在A,则为0 例如: SELECT CHARINDEX('aaaa','abaaaacded')  ----- ...