C#处理跑步计时日志:字符串拆分与十六进制转十进制实现
跑步计时日志转换程序优化方案
1. 无效行过滤
直接跳过包含uptime关键字的行,避免处理无用数据:
with open("logfile.txt", "r") as f: for line in f: line = line.strip() if "uptime" in line: continue # 处理有效行 process_valid_line(line)
2. 行拆分与字段解析
针对固定格式的有效行,按字符位置直接截取字段(可根据实际日志长度调整索引):
def process_valid_line(line): # 提取垫子编号(前4位) mat_code = line[:4] # 维护垫子编号映射表,可按需扩展 mat_mapping = {"aaA1": "Mat 1", "bbB2": "Mat 2"} mat = mat_mapping.get(mat_code, f"Unknown Mat ({mat_code})") # 提取十六进制Bib号(示例取第4-16位,可根据实际调整) hex_bib = line[4:16] bib_num = int(hex_bib, 16) # 若需截取特定位(如低16位),改用:bib_num = int(hex_bib[-4:], 16) bib = f"Bib {bib_num}" # 跳过中间4位,提取日期(第20-26位,格式YYMMDD) date_str = line[20:26] # 动态处理年份,无需硬编码 from datetime import datetime date = datetime.strptime(date_str, "%y%m%d").strftime("%-m/%-d/%y") # 提取时间(第26-36位),调用你已实现的格式化函数 time_str = line[26:36] formatted_time = your_time_format_function(time_str) # 提取读取类型(最后2位) read_type_code = line[-2:] type_mapping = { "FS": "First Seen Read", "BS": "Best Seen Read", "LS": "Last Seen Read" } read_type = type_mapping.get(read_type_code, f"Unknown Type ({read_type_code})") # 输出或保存转换结果 print(f"{mat}, {bib}, {date}, {formatted_time}, {read_type}")
3. 整合你的时间格式化函数
将你单独实现的时间格式化逻辑直接嵌入流程,示例如下:
def your_time_format_function(time_str): # 输入1605112664 → 输出16:05:11.2664 hh = time_str[:2] mm = time_str[2:4] ss = time_str[4:6] ms = time_str[6:] return f"{hh}:{mm}:{ss}.{ms}"
将此函数放在process_valid_line之前即可直接调用。
4. 行拆分困难的备用方案
如果日志行不是固定长度,用正则表达式匹配结构:
import re # 正则匹配有效行结构:4位垫子码+12位十六进制+4位中间码+6位日期+10位时间+2位类型 pattern = r"^([A-Za-z0-9]{4})([0-9A-Fa-f]{12})([A-Za-z0-9]{4})(\d{6})(\d{10})([A-Z]{2})$" match = re.match(pattern, line) if match: mat_code, hex_bib, _, date_str, time_str, read_type_code = match.groups() # 后续处理逻辑同上述固定长度方案
内容的提问来源于stack exchange,提问作者rlandis8yahoocom
相关产品推荐
相关产品推荐

