Lua 分析文本文件功率数值 实现最值/众数/平均值统计咨询
方案可行性说明
你现有的实现思路是可行的,但存在3处需要修正的问题:
- 正则匹配提取的数值为字符串类型,直接传入
math.max/math.min会触发类型错误 - 未加入0值过滤逻辑,不符合忽略0值的统计要求
- 缺少众数统计的相关逻辑
- 原有平均值计算需要两次遍历读取文件,IO效率偏低,存入表后可一次遍历完成所有统计操作
优化后的完整实现
-- 初始化存储变量:有效值表、总和、有效计数、数值频率表 local valid_values = {} local sum = 0 local count = 0 local freq = {} -- 单次遍历读取文件所有行,无需重复读取 for line in io.lines("/www/EnergyPlug-b.txt") do -- 直接转换行内容为数值,比正则匹配兼容性更强,自动过滤非数值异常行 local val = tonumber(line) -- 过滤规则:仅合法且大于0的数值参与统计,自动忽略0值 if val and val > 0 then table.insert(valid_values, val) -- 累加总和与有效计数 sum = sum + val count = count + 1 -- 统计数值出现频率,用于后续计算众数 freq[val] = (freq[val] or 0) + 1 end end -- 边界判断:无有效记录时直接输出提示,避免后续逻辑报错 if count == 0 then print("无符合要求的有效功率记录") return end -- 计算各项统计值 local max_val = math.max(unpack(valid_values)) local min_val = math.min(unpack(valid_values)) local avg_val = sum / count -- 计算众数:取出现频率最高的数值 local mode_val = nil local max_freq = 0 for val, cnt in pairs(freq) do if cnt > max_freq then max_freq = cnt mode_val = val end end -- 输出所有统计结果 print("有效记录数量:" .. count) print("功率总和:" .. sum .. " W") print("平均值:" .. string.format("%.1f", avg_val) .. " W") print("最高值:" .. max_val .. " W") print("最低值:" .. min_val .. " W") print("众数:" .. mode_val .. " W(出现" .. max_freq .. "次)")
核心调整说明
- 用
tonumber直接转换行内容为数值,替换原有正则匹配,可兼容2位及以上整数位的功率值(比如10.5W),同时自动过滤非数值的异常行 - 加入了数值有效性判断:仅合法且大于0的数值才会参与统计,自动过滤0值和无效记录
- 遍历过程中同步统计数值出现频次,无需二次遍历即可计算众数
- 增加了无有效记录的边界判断,避免count为0时触发除法报错
- 输出结果保留统一的功率单位,平均值可通过
string.format控制保留小数位数,可根据需求调整
内容的提问来源于stack exchange,提问作者nodecentral
相关产品推荐
相关产品推荐

