-
asc 파일을 m_id별로 분리하기tip 2025. 1. 4. 13:24
01_split_asc_per_id asc 파일을 CAN 메시지 아이디별로 분리 저장한다.¶
- 차에서 받은 CAN 트레이스에는 여러 메시지 아이디(m_id)들의 메시지들이 있다.
- m_id별 분석을 위해서 m_id별로 asc 파일을 만들어 메시지들을 저장한다.
In [1]:from pathlib import Path import pandas as pd
In [2]:# 아래 asc 파일을 대상으로 한다. path_to_data_asc = Path(r'C:\Users\haese\OneDrive\01_Projects\1_picode\05_tosun\30_기술\00_교육_자료\CySec\IDS\20240725_venue2024_07_26_09_17_29.asc') # 현재 디렉토리 아래에 asc_per_id 디렉토리를 만든다. dir_output = Path('.').absolute()/'asc_per_id' dir_output.mkdir(exist_ok=True)
In [3]:def get_m_ids(input_file): ''' input_file에 있는 CAN 메시지의 ID를 반환한다. claudi.ai가 작성한 filter_can_messages() 코드를 조금 수정하였다. ''' m_ids = set() with open(input_file, 'r') as infile: # Skip metadata for _ in range(4): line = infile.readline() # Process CAN messages for line in infile: parts = line.split() if len(parts) >= 3: m_id = parts[2] m_ids.add(m_id) return m_ids
In [7]:# asc 파일에 있는 CAN 메시지 ID를 가져온다. m_ids = get_m_ids(path_to_data_asc) print(f'{len(m_ids) = :,}') print(m_ids)
len(m_ids) = 59 {'549', '394', '111', '340', '044', '153', '4E6', '436', '200', '124', '316', '593', '502', '329', '541', '113', '545', '557', '5CF', '4A7', '492', '53E', '50C', '346', '080', '556', '34C', '4E7', '547', '483', '50E', '043', '38D', '500', '164', '5A0', '417', '042', '386', '4E5', '381', '251', '553', '112', '5B0', '5FA', '220', '2B0', '52A', '4F1', '280', '374', '383', '5CE', '260', '18F', '507', '081', '387'}
In [5]:def filter_can_messages(input_file, output_file, filter_ids, filter_type): ''' written by claude.ai Filter CAN messages based on message IDs ''' with open(input_file, 'r') as infile, open(output_file, 'w') as outfile: # Write metadata for _ in range(4): line = infile.readline() outfile.write(line) # Process CAN messages for line in infile: parts = line.split() if len(parts) >= 3: m_id = parts[2] if filter_type == 'pass': if m_id in filter_ids: outfile.write(line) elif filter_type == 'stop': if m_id not in filter_ids: outfile.write(line)
In [6]:for m_id in m_ids: output_file = dir_output/f'{m_id}.asc' print(f'Filtering {m_id} to {output_file.name}') filter_can_messages(path_to_data_asc, dir_output/f'{m_id}.asc', [m_id], 'pass')
Filtering 549 to 549.asc Filtering 394 to 394.asc Filtering 111 to 111.asc Filtering 340 to 340.asc Filtering 044 to 044.asc Filtering 153 to 153.asc Filtering 4E6 to 4E6.asc Filtering 436 to 436.asc Filtering 200 to 200.asc Filtering 124 to 124.asc Filtering 316 to 316.asc Filtering 593 to 593.asc Filtering 502 to 502.asc Filtering 329 to 329.asc Filtering 541 to 541.asc Filtering 113 to 113.asc Filtering 545 to 545.asc Filtering 557 to 557.asc Filtering 5CF to 5CF.asc Filtering 4A7 to 4A7.asc Filtering 492 to 492.asc Filtering 53E to 53E.asc Filtering 50C to 50C.asc Filtering 346 to 346.asc Filtering 080 to 080.asc Filtering 556 to 556.asc Filtering 34C to 34C.asc Filtering 4E7 to 4E7.asc Filtering 547 to 547.asc Filtering 483 to 483.asc Filtering 50E to 50E.asc Filtering 043 to 043.asc Filtering 38D to 38D.asc Filtering 500 to 500.asc Filtering 164 to 164.asc Filtering 5A0 to 5A0.asc Filtering 417 to 417.asc Filtering 042 to 042.asc Filtering 386 to 386.asc Filtering 4E5 to 4E5.asc Filtering 381 to 381.asc Filtering 251 to 251.asc Filtering 553 to 553.asc Filtering 112 to 112.asc Filtering 5B0 to 5B0.asc Filtering 5FA to 5FA.asc Filtering 220 to 220.asc Filtering 2B0 to 2B0.asc Filtering 52A to 52A.asc Filtering 4F1 to 4F1.asc Filtering 280 to 280.asc Filtering 374 to 374.asc Filtering 383 to 383.asc Filtering 5CE to 5CE.asc Filtering 260 to 260.asc Filtering 18F to 18F.asc Filtering 507 to 507.asc Filtering 081 to 081.asc Filtering 387 to 387.asc
'tip' 카테고리의 다른 글
침입 판정 기준값 데이터 준비 (0) 2025.01.04 asc 파일을 pandas 데이터프레임으로 변환하기 (0) 2025.01.04 mdf 데이터 파일을 읽어서 그래프 그리기 (1) 2025.01.01 CAN dbc 편집 (0) 2024.12.30 async 유무의 차이 - app.set_system_var_double_async() 에서 (0) 2024.12.26