通过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. [LeetCode] Alien Dictionary 另类字典

    There is a new alien language which uses the latin alphabet. However, the order among letters are un ...

  2. [LeetCode] Department Highest Salary 系里最高薪水

    The Employee table holds all employees. Every employee has an Id, a salary, and there is also a colu ...

  3. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  4. 编译自己的Ubuntu内核

    很多时候我们在使用Ubuntu的时候,想修改一下内核配置,然后编译,安装到Ubuntu中.这也是进行Ubuntu内核开发的前提. 获取当前Ubuntu对应代码 有很多方法可以获得Ubuntu内核代码, ...

  5. jqGrid jqGrid分页参数+条件查询

    HTML <div class="row"> <div class="col-sm-20"> <form id="for ...

  6. curl的登录总结

    demo1 <?php $curl=curl_init('http://www.baidu.com'); curl_exec($curl); curl_close($curl); ?> c ...

  7. Java学习笔记(三)

    今天主要学习了ant ant概述 ant是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发.在实际软件开发中,有很多地方可以用到ant 开发环境: Sy ...

  8. 马虎将classname加到了id属性中,造成报错

    今天做了一个瀑布流布局的小例子,自己在写代码的过程中一直报cannot read property 'style' of null,百度之后说是页面还没有加载完,但是我看了代码是写在window.on ...

  9. console 输出信息美化

    不久前在一些前端的网站上看到的效果,以前觉得console只是拿来做做调试,不过现在看到别人网站的console美化效果,这个还可以作为一种网站个性来显示的.. 以%c开头,后面的文字就打印的信息,后 ...

  10. 使用rsync+inotify同步两台服务器文件

    目标功能:将B服务器文件同步到A服务器 A服务器rsyncd.conf配置 权限600 A服务器rsyncd.pas文件配置  权限600 同步文件路径 /data/wwwroot/shen/  权限 ...