通过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] Majority Element 求众数

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  2. [LeetCode] Gas Station 加油站问题

    There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...

  3. 占位符行为 PlaceHolderBehavior 的实现以及使用

    这个效果我不太会描述 PlaceHolder直译占位符 也有人把这个效果叫水印效果 就是和HTML5的PlaceHolder属性一样的效果 上图直观: 使用方法: 首先下载 占位符行为dll.rar  ...

  4. docker 学习过程

    参考: http://git.oschina.net/search?search=csphere&type=project&language=&page=2&condi ...

  5. vue-Resource(与后端数据交互)

    单来说,vue-resource就像jQuery里的$.ajax,用来和后端交互数据的.可以放在created或者ready里面运行来获取或者更新数据... vue-resource文档:https: ...

  6. py-faster-rcnn之从solver文件创建solver对象,建立pythonlayer

    faster-rcnn在训练阶段,根据一个solver的prototxt文件创建相应的网络.仅凭一个prototxt就创建网络?其实还涉及到自定义的PythonLayer. 比如lib/rpn/anc ...

  7. [UWP] 使用SemanticZoom控件

    在写一个看新闻软件的时候,用到了SemanticZoom控件,遇到了一些问题,比如如何根据首字母分类,以及放大视图中有数据的和没数据的通过背景色或前景色区分,幸运的是,all solved. 先来个效 ...

  8. [bigdata] 使用Redis队列来实现与机器无关的Job提交与执行 (python实现)

    用例场景: 定时从远程多台机器上下载文件存入HDFS中.一开始采用shell 一对一的方式实现,但对于由于网络或者其他原因造成下载失败的任务无法进行重试,且如果某台agent机器down机,将导致它对 ...

  9. 【原】webp图片牛刀小试

    其实今年很早就有接触到webp图片的概念,只是一直没怎么弄.今天在一个小项目中小用了一番.总结总结 采用 what,why,how的方式来总结 what? 什么是webp图片? 维基百科:       ...

  10. CSS之div和span标签

    div和span是非常重要的标签,div的语义是division"分割": span的语义就是span"范围.跨度". 这两个东西,都是最最重要的"盒 ...