C#提取CAN ASC文件時間戳:實現與性能優化

C#提取CAN ASC文件時間戳:實現與性能優化

在汽車電子和工業控制領域,CAN總線是最常用的通信協議之一。而ASC(ASCII)文件作為CAN總線數據的標準日志格式,廣泛應用于數據記錄和分析場景。本文將深入探討如何高效地從CAN ASC文件中提取時間戳數據,并分享一個高性能的C#實現方案。

一、CAN ASC文件格式解析

CAN ASC文件是一種基于文本的日志格式,通常包含CAN總線的通信時間戳、消息ID、數據長度和數據內容。一個典型的ASC文件片段如下:

date Tue Aug 22 15:35:42 2023
base hex  timestamps absolute0.000000 18F00000x         Rx   d 8 00 00 00 00 00 00 00 00  Channel=10.001000 18F00001x         Rx   d 8 00 00 00 00 00 00 00 00  Channel=10.002000 18F00002x         Rx   d 8 00 00 00 00 00 00 00 00  Channel=1

其中,每行的第一個字段(如0.000000)即為時間戳,表示消息發送的相對或絕對時間。在解析時,我們需要跳過文件頭的元數據行,從第三行開始提取時間戳信息。

二、時間戳提取的C#實現

下面是一個高效的C#實現,用于從ASC文件中提取時間戳數據:

public class AscExtractor
{public List<decimal> Extract(string path){var text = "";using (var sr = new StreamReader(path)){text = sr.ReadToEnd();}var options = StringSplitOptions.RemoveEmptyEntries;return text.Split(new char[] { '\n', '\r' }, options).Where(t => !string.IsNullOrWhiteSpace(t)).Skip(2).Select(t => t.Split(new char[] { ' ', '\t' }, options)).Select(t => t[0]).Select(t => decimal.Parse(t)).ToList();}
}
  • 代碼解析:
  1. 文件讀取:使用StreamReader一次性讀取整個文件內容,適用于中等大小的ASC文件。
  2. 行分割:通過Split方法將文本按行分割,并移除空行。
  3. 跳過頭部:使用Skip(2)跳過文件的前兩行元數據,可根據實際情況調整。
  4. 字段提取:對每行數據按空格或制表符分割,提取第一個字段作為時間戳。
  5. 類型轉換:將字符串類型的時間戳解析為decimal類型,確保高精度。

三、性能優化與最佳實踐

1. 大文件處理優化

對于GB級別的超大ASC文件,一次性讀取整個文件會導致內存溢出。可采用流式處理方式:

public List<decimal> ExtractLargeFile(string path)
{var timestamps = new List<decimal>();using (var sr = new StreamReader(path)){// 跳過頭部sr.ReadLine();sr.ReadLine();var line = "";while ((line = sr.ReadLine()) != null){if (string.IsNullOrWhiteSpace(line)){continue;} var fields = line.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);if (fields.Length > 0){timestamps.Add(decimal.Parse(fields[0]));}}}return timestamps;
}

2. 異常處理增強

在實際應用中,ASC文件可能包含格式錯誤的行,需要添加異常處理:

public List<decimal> ExtractWithErrorHandling(string path)
{var timestamps = new List<decimal>();using (var sr = new StreamReader(path)){// 跳過頭部sr.ReadLine();sr.ReadLine();var line = "";var lineNumber = 3; // 從第三行開始計數while ((line = sr.ReadLine()) != null){try{if (string.IsNullOrWhiteSpace(line)) continue;var fields = line.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);if (fields.Length > 0){timestamps.Add(decimal.Parse(fields[0]));}}catch (Exception ex){// 記錄錯誤行號和錯誤信息Console.WriteLine($"Error parsing line {lineNumber}: {ex.Message}");}lineNumber++;}}return timestamps;
}

3. 并行處理加速

對于多核CPU系統,可使用PLINQ并行處理提高解析速度:

public List<decimal> ExtractParallel(string path)
{string text;using (var sr = new StreamReader(path)){text = sr.ReadToEnd();}return text.Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries).AsParallel().AsOrdered().Where(line => !string.IsNullOrWhiteSpace(line)).Skip(2).Select(line =>{var fields = line.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);return decimal.Parse(fields[0]);}).ToList();
}

四、應用場景與擴展

1. 時間序列分析

提取的時間戳可用于分析CAN消息的發送頻率、間隔分布等時序特征,幫助診斷總線負載和通信異常。

2. 數據可視化

結合圖表庫(如OxyPlot、Chart.js),將時間戳與CAN消息內容結合,直觀展示總線通信狀態:

3. 高性能擴展

對于工業級應用,可考慮使用MemoryMappedFile進行內存映射讀取,或使用Span<T>進行零分配解析,進一步提升性能。

五、總結

本文介紹了CAN ASC文件的格式特點,并提供了多種C#實現方案來提取時間戳數據。在實際應用中,應根據文件大小、性能需求和容錯要求選擇合適的實現方式。對于中小文件,可使用簡潔的LINQ鏈式處理;對于大文件,則建議采用流式處理或并行解析。通過合理優化,可實現每秒百萬級時間戳的高效提取,滿足大多數工業和汽車電子領域的數據分析需求。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/86246.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86246.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/86246.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機網絡基礎總結:TCP/IP 模型、TCP vs UDP、DNS 查詢過程

在學習計算機網絡的過程中&#xff0c;理解 TCP/IP 模型與 OSI 模型的對應關系、掌握 TCP 與 UDP 的區別&#xff0c;以及熟悉 DNS 的查詢過程&#xff0c;是打好網絡基礎的關鍵。本文將圍繞這三部分進行簡明扼要的講解。 一、TCP/IP 模型與 OSI 七層模型的對應關系 1. OSI 七…

基于PHP的扎染文創產品商城

有需要請加文章底部Q哦 可遠程調試 基于PHP的扎染文創產品商城 一 介紹 扎染文創產品商城系統基于原生PHP開發&#xff0c;數據庫mysql&#xff0c;前端bootstrap&#xff0c;jquery.js等。系統角色分為用戶和管理員。 技術棧&#xff1a;phpmysqlbootstrapphpstudyvscode 二…

數據庫學習(三)——MySQL鎖

一、MySQL鎖 當多個用戶或進程并發操作數據庫時&#xff0c;為了避免數據沖突、臟讀、不可重復讀、幻讀等問題&#xff0c;數據庫通過鎖機制來保證數據的一致性和完整性。 MySQL 鎖的總體分類&#xff1a; 分類維度類型說明按作用對象表級鎖&#xff08;Table Lock&#xff…

<3>-MySQL表的操作

目錄 一&#xff0c;創建表 二&#xff0c;查看表結構 三&#xff0c;修改表 四&#xff0c;刪除表 一&#xff0c;創建表 語法&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校驗規則 eng…

【OSG學習筆記】Day 15: 路徑動畫與相機漫游

本章來學習下漫游相機。 路徑動畫與相機漫游 本屆內容比較簡單&#xff0c;其實就是實現物體的運動和相機的運動 當然這兩個要一起執行。 貝塞爾曲線 貝塞爾曲線&#xff08;Bzier curve&#xff09;是一種在計算機圖形學、動畫制作、工業設計等領域廣泛應用的參數曲線&am…

LabVIEW自感現象遠程實驗平臺

LabVIEW開發自感現象遠程實驗平臺&#xff0c;通過整合 NI數據采集設備、菲尼克斯&#xff08;Phoenix Contact&#xff09;繼電器模塊及羅技&#xff08;Logitech&#xff09;高清攝像頭&#xff0c;實現遠程數據采集、儀器控制與實時監控三大核心功能。平臺突破傳統實驗裝置局…

數據結構——F/圖

一、圖的基本概念 圖是由頂點集合及頂點間的關系組成的一種數據結構&#xff1a;G (V&#xff0c; E)&#xff0c;其中&#xff1a; 頂點集合V {x|x屬于某個數據對象集}是有窮非空集合&#xff1b; E {(x,y)|x,y屬于V}或者E {<x, y>|x,y屬于V && Path(x, y)…

springcloud openfeign 偶現 Caused by: java.net.UnknownHostException

背景 最近查看日志發現某服務偶現Caused by: java.net.UnknownHostException 同時查看eureka的access.log 出現如下異常 10.xxx.xxx.xxx - - [27/May/2025:23:57:29 0800] “PUT /eureka/apps/{appName}/{host}:xxx-job:8082?statusUP&lastDirtyTimestamp1748351637173 H…

第12篇:數據庫中間件日志設計與追蹤系統落地實踐

12.1 引言&#xff1a;中間件日志系統為何如此關鍵&#xff1f; 數據庫中間件作為連接前端應用與后端數據庫的“網關”&#xff0c;承載著路由、負載均衡、SQL 改寫、權限控制等復雜邏輯。 在出現 性能問題、故障排查、安全審計 等場景中&#xff0c;若沒有完善的日志體系&am…

OpenAI對抗法庭命令:捍衛ChatGPT用戶隱私之戰

人工智能公司OpenAI近期正積極對抗一項涉及隱私問題的法庭命令。該命令要求OpenAI保留所有ChatGPT用戶日志&#xff0c;包括已刪除的對話記錄以及通過API調用生成的聊天內容。 命令背后的真實動機 值得注意的是&#xff0c;法院發布這一指令并非出于對用戶隱私或內容安全的考…

嵌入式學習--江協stm32day5

USART 1. 引腳與接口層 異步引腳&#xff1a; TX&#xff1a;發送數據輸出&#xff1b;RX&#xff1a;接收數據輸入&#xff1b;SW_RX&#xff1a;單線半雙工模式的接收引腳&#xff08;替代 RX&#xff09;。 同步引腳&#xff1a;SCLK&#xff1a;同步模式下的時鐘輸出&…

使用Fiddler抓包

有時候需要跟蹤一些小程序的HTTP請求&#xff0c;但是無法像瀏覽器一樣F12查看請求&#xff0c;因此需要借助其他的工具進行&#xff0c;在這里推薦使用Fiddler 配置 此時檢查系統代理已經變成如下配置&#xff1a; 抓包 此時隨便打開一個小程序&#xff0c;就可以進行抓包…

python學習打卡day47

DAY 47 注意力熱圖可視化 昨天代碼中注意力熱圖的部分順移至今天 知識點回顧&#xff1a; 熱力圖 作業&#xff1a;對比不同卷積層熱圖可視化的結果 # 可視化空間注意力熱力圖&#xff08;顯示模型關注的圖像區域&#xff09; def visualize_attention_map(model, test_loader,…

MySQL-運維篇

運維篇 日志 錯誤日志 錯誤日志是 MySQL 中最重要的日志之一&#xff0c;它記錄了當 mysqld 啟動和停止時&#xff0c;以及服務器在運行過程中發生任何嚴重錯誤時的相關信息當數據庫出現任何故障導致無法正常使用時&#xff0c;建議首先查看此日志。 該日志是默認開啟的&am…

Prompt Tuning(提示調優)到底訓練優化的什么部位

Prompt Tuning(提示調優)到底訓練優化的什么部位 在自然語言處理(NLP)領域,Prompt Tuning(提示調優)是一種輕量級的模型優化技術,其核心目標是通過優化提示(Prompt)來引導預訓練語言模型(如GPT、BERT等)更好地完成特定任務,而無需大規模調整模型的主體參數。 一…

基于FPGA的超聲波顯示水位距離,通過藍牙傳輸水位數據到手機,同時支持RAM存儲水位數據,讀取數據。

基于FPGA的超聲波顯示水位距離 前言一、整體框架二、代碼架構1.超聲波測距模塊2.藍牙數據發送模塊3.數碼管數據切換模塊4.數碼管驅動模塊6.串口驅動7.頂層模塊8.RAM ip核 仿真相關截圖 前言 隨著工業化進程的加速和環境保護意識的提升&#xff0c;對水資源管理和水位監測的需求…

OD 算法題 B卷【水果攤小買賣】

文章目錄 水果攤小買賣 水果攤小買賣 小王手里有點閑錢&#xff0c;想做點水果買賣&#xff0c;給出兩個數組m, n&#xff0c; m[i]表示第i個水果的成本價&#xff0c;n[i]表示第i個水果能賣出的價格&#xff1b;假如現在有本錢k&#xff0c;試問最后最多能賺多少錢&#xff1…

(新手友好)MySQL學習筆記(6):分組查詢,正則表達式

目錄 分組查詢 創建分組 過濾分組 分組查詢練習 正則表達式 匹配單個實例 匹配多個實例 正則表達式練習 練習答案 分組查詢練習答案 正則表達式練習答案 分組查詢 創建分組 group by 子句&#xff1a;根據一個或多個字段對結果集進行分組&#xff0c;在分組的字段上…

Android 之 kotlin 語言學習筆記四(Android KTX)

一、Android KTX 簡介 Android KTX 是包含在 Android Jetpack 及其他 Android 庫中的一組 Kotlin 擴展程序。KTX 擴展程序可以為 Jetpack、Android 平臺及其他 API 提供簡潔的慣用 Kotlin 代碼。為此&#xff0c;這些擴展程序利用了多種 Kotlin 語言功能&#xff0c;其中包括&…

云原生思維重塑數字化基座:從理念到實踐的深度剖析

&#x1f4dd;個人主頁&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 一、引言&#xff1a;云原生為何成為數字化的“基礎設施語言”&#xff1f; 隨著5G、人工智能、物聯網等技術逐步進入規模化落地階段&am…