LIN信号对比脚本
实现效果:可以将大量信号和多个ldf文件中的lin信号进行比对,并以表格输出帧标识符、信号所属ldf文件名称、对比成功的lin信号
需要你自己构建,我就不上传文件了
python环境:3.x
建立find.csv
用于存放需要对比的信号(想改名字的自己改代码,就不放图展示了)
注意:只能放在第一列,不要有标题什么的,就纯放需要对比的信号
构建compare_signals.py
# -*- coding: utf-8 -*-
import re
import csv
import os
import globdef parse_ldf_signals(ldf_content, ldf_filename):"""从LDF文件内容中解析出信号,并附带其帧ID和来源文件名。"""signal_details = {}frames_match = re.search(r'Frames\s*\{(.+)\}', ldf_content, re.DOTALL)if not frames_match:return signal_detailsframes_content = frames_match.group(1)frame_pattern = re.compile(r'(\w+)\s*:\s*(0x[0-9a-fA-F]+|\d+)\s*,\s*([\w_]+)\s*,\s*(\d+)\s*\{\s*([^}]*?)\s*\}', re.DOTALL)for match in frame_pattern.finditer(frames_content):frame_id = match.group(2)signals_block = match.group(5)if signals_block.strip():signal_pattern = re.compile(r'^\s*(\w+)\s*,', re.MULTILINE)for signal_match in signal_pattern.finditer(signals_block):signal_name = signal_match.group(1)signal_details[signal_name] = (frame_id, ldf_filename)return signal_detailsdef main():"""主函数,实现“包含”匹配,并将同一CSV信号的所有匹配项合并到一行内,并对各字段去重。"""print("--- LDF 与 CSV 信号比对脚本 (聚合输出模式) ---")# --- 解析所有LDF文件 ---ldf_files = glob.glob('*.ldf')if not ldf_files:print("\n错误: 在当前目录下未找到任何 .ldf 文件。")returnprint(f"\n在当前目录找到 {len(ldf_files)} 个LDF文件,开始解析...")master_signal_map = {}for ldf_file in ldf_files:try:with open(ldf_file, 'r', encoding='utf-8', errors='ignore') as f:ldf_content = f.read()signal_map = parse_ldf_signals(ldf_content, ldf_file)master_signal_map.update(signal_map)except Exception as e:print(f" 解析文件 {ldf_file} 时发生错误: {e}")if not master_signal_map:print("\n在所有LDF文件中均未解析到任何信号。")returnprint(f"所有LDF文件解析完成,共找到 {len(master_signal_map)} 个唯一信号。")# --- 处理CSV文件并生成合并后的四列格式输出 ---csv_filename = 'find.csv'if not os.path.exists(csv_filename):print(f"\n错误: CSV文件 '{csv_filename}' 不存在。")returnoutput_filename = f"matched_{os.path.splitext(csv_filename)[0]}.csv"try:with open(csv_filename, 'r', encoding='utf-8', errors='ignore') as infile, \open(output_filename, 'w', encoding='utf-8', newline='') as outfile:reader = csv.reader(infile)writer = csv.writer(outfile)# 写入固定的表头writer.writerow(["CSV_Query_Signal", "Frame_IDs", "Source_LDFs", "Matched_LDF_Signals"])print(f"\n正在处理CSV文件 '{csv_filename}' 并生成聚合结果...")processed_csv_rows = 0# 读取所有CSV信号到内存csv_signals = [row[0].strip() for row in reader if row]# 遍历CSV中的每一个查询信号for csv_signal in csv_signals:processed_csv_rows += 1# 使用集合(set)来自动处理去重found_frame_ids = set()found_source_ldfs = set()found_ldf_signals = set()# 遍历LDF信号数据库,收集所有匹配项for ldf_signal, (frame_id, source_ldf) in master_signal_map.items():if csv_signal in ldf_signal:found_frame_ids.add(frame_id)found_source_ldfs.add(os.path.basename(source_ldf))found_ldf_signals.add(ldf_signal)# 如果找到了匹配项,则合并结果并写入if found_ldf_signals:writer.writerow([csv_signal,"; ".join(sorted(list(found_frame_ids))),"; ".join(sorted(list(found_source_ldfs))),"; ".join(sorted(list(found_ldf_signals)))])else:# 如果未找到匹配项writer.writerow([csv_signal, "未找到", "N/A", "N/A"])print("\n--- 处理完成 ---")print(f"总共处理了 {processed_csv_rows} 个CSV查询信号。")print(f"结果已保存到文件: {output_filename}")except Exception as e:print(f"处理文件时发生错误: {e}")if __name__ == "__main__":main()
构建compare_signals.bat
@echo off
python compare_signals.py
pause
测试效果
将以上三个文件放在ldf文件所在文件夹下,双击bat运行