You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lua 分析文本文件功率数值 实现最值/众数/平均值统计咨询

方案可行性说明

你现有的实现思路是可行的,但存在3处需要修正的问题:

  1. 正则匹配提取的数值为字符串类型,直接传入math.max/math.min会触发类型错误
  2. 未加入0值过滤逻辑,不符合忽略0值的统计要求
  3. 缺少众数统计的相关逻辑
  4. 原有平均值计算需要两次遍历读取文件,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 12:06:03