PHP实现:基于文件名模式查找指定玩家的最新数据文件
如何解析玩家数据文件名并找到指定玩家的最新文件?
别担心,正则其实没那么可怕——咱们甚至可以不用复杂正则,用简单的字符串拆分就能搞定这个需求!我给你两种实用方案,不管是用脚本还是终端命令都能解决。
首先先明确你的文件名规则:每个文件都是玩家ID-年-月-日-时-分-秒-seed-data.json,比如8841-2018-05-03-09-56-14-2118-data.json,我们需要提取玩家ID和时间,然后找出指定玩家的最新文件。
方案一:用Python脚本(推荐,兼容性强)
这个方法逻辑清晰,容易修改,适合处理大量文件或者格式有小变动的情况:
import os from datetime import datetime def find_latest_gamer_file(target_dir, target_gamer_id): latest_file = None latest_time = None # 遍历目标目录下的所有文件 for filename in os.listdir(target_dir): # 先过滤掉不符合后缀的文件 if not filename.endswith('-data.json'): continue # 去掉末尾的'-data.json',再用'-'拆分文件名 core_parts = filename.replace('-data.json', '').split('-') # 正常格式应该拆成8部分:玩家ID+6个时间字段+seed if len(core_parts) != 8: continue current_gamer_id = core_parts[0] # 提取时间相关的6个部分:年、月、日、时、分、秒 time_components = core_parts[1:7] # 拼成datetime能识别的字符串,比如"2018-05-03 09:56:14" time_str = f"{'-'.join(time_components[:3])} {':'.join(time_components[3:])}" try: # 把字符串转成datetime对象,方便比较时间先后 file_datetime = datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S") except ValueError: # 遇到格式不对的文件直接跳过 continue # 如果是目标玩家的文件,就比较时间 if current_gamer_id == target_gamer_id: if latest_time is None or file_datetime > latest_time: latest_time = file_datetime latest_file = os.path.join(target_dir, filename) return latest_file # ------------------- 示例用法 ------------------- # 替换成你的数据文件所在目录 data_dir = "./player_data" # 替换成你要找的玩家ID target_id = "8841" result = find_latest_gamer_file(data_dir, target_id) if result: print(f"找到了玩家{target_id}的最新数据文件:{result}") else: print(f"没有找到玩家{target_id}的任何数据文件")
代码说明:
- 完全不用正则,用
split('-')和replace拆分文件名,新手也能看懂 - 用
datetime处理时间,比直接字符串排序更可靠(比如不会出现“10点”比“9点”小的问题) - 自动过滤不符合格式的文件,避免报错
方案二:用Bash终端命令(适合快速处理)
如果你习惯用终端操作,这个一行命令就能搞定:
#!/bin/bash # 替换成你要找的玩家ID TARGET_GAMER="8841" # 替换成你的数据目录 DATA_DIR="./player_data" # 核心命令:筛选、提取时间、排序、取最新 ls -1 "$DATA_DIR"/*-"$TARGET_GAMER"-*-data.json 2>/dev/null | \ awk -F'-' '{print $2"-"$3"-"$4" "$5":"$6":"$7" "$0}' | \ sort -r | \ head -n1 | \ awk '{print $3}'
命令说明:
ls -1列出所有目标玩家的文件,2>/dev/null忽略找不到文件的错误awk把文件名拆分成时间字符串和文件名,拼成“时间 文件名”的格式sort -r按时间逆序排序(最新的排在最前面)head -n1取第一个结果,就是最新的文件- 最后用
awk输出文件名
两种方案都能完美解决你的问题,根据自己的使用场景选就行~
内容的提问来源于stack exchange,提问作者Undefined Variable
相关产品推荐
相关产品推荐

