Lua - 分析文本文件中的数值

我正在将功率(瓦特)数值写入文本文件,以便提取我可以使用的信息。

4.7
4.7
4.8
5.2
5.1
4.6
4.6
4.6

目前,我有以下代码可以给我平均值,但我想添加一些信息,例如最高值,最低值,最常见值,如果可能的话,记录有任何‘0’值(* - 如果可能的话,忽略它们..)

local ctr = 0
local sum = 0

for _ in io.lines"/www/EnergyPlug-b.txt" do
    ctr = ctr + 1
end
print(ctr)

for line in io.lines"/www/EnergyPlug-b.txt" do
    sum = sum + line
end
print(sum)
average = sum / ctr
print(average)

我尝试使用第一个io.lines部分通过table.insert()创建一个Lua表,如下所示,但我不确定它有多好?

local rows = {}
-- 逐行扫描文件
for line in io.lines"/www/EnergyPlug-b.txt"do
  -- 如果行匹配 ?.?,则插入表中
  local value = line:match"%d%p%d"-- 1.5
    --print(value)
    table.insert(rows,value)
end

local arraymax = math.maxunpack(rows))
local arraymin = math.minunpack(rows))

print(arraymax) - ?.?
print(arraymin) - ?.?

如果上面的代码适用,请问我应该如何最好地确定我所提到的项目/值?

原文链接 https://stackoverflow.com/questions/69581701

点赞
stackoverflow用户2858170
stackoverflow用户2858170

在第一个代码片段中,没有必要为 ctr 和 sum 分别设置一个循环。你可以在一个循环中完成它。

你的第二个片段没问题。unpack 是有限制的,所以这对于很多千个值不起作用。

您必须遍历表格以获取其他值,因此您也可以在该循环中确定 min 和 max,而无需考虑该大小限制。

如果该文件中仅包含那些数字,那么local value = line:match("%d%p%d") 这里可以跳过模式匹配。

这些计算相当简单。我不确定您在这里有什么困难。

local min = math.huge --使用一个肯定比任何值都大的值
local max = -math.huge --使用一个肯定比任何值都小的值
local counts = {} --一个空表,我们将用它来计算每个值出现的频率
local numIngored = 0 --我们忽略了多少个0值?
for line in io.lines(yourFileName) do
  --将字符串转换为数字
  local value = tonumber(line)
  --如果我们考虑该值
  if value ~= 0.0 then
    --更新最小值和最大值
    min = value < min and value or min
    max = value > max and value or max
    --更新计数
    counts[value] = counts[value] and counts[value] + 1 or 1
  else
    --计数被忽略的值
    numIgnored = numIgnored + 1
  end
end

我将留给您从counts中获取最频繁值的方法。

2021-10-15 08:46:40
stackoverflow用户6676439
stackoverflow用户6676439

感谢 @piglet 和其他 SO 帖子的帮助,这是我最后得出的代码:

local min = math.huge -- 使用绝对大于任何值的值
local max = -math.huge -- 使用绝对小于任何值的值
local ctr = 0
local valtotal = 0
local counts = {} -- 我们将用一个空表来计算每个值出现的次数
local numIngored = 0 -- 我们忽略了多少个值为 0 的值?
for line in io.lines("/www/EnergyPlug-b.txt") do
  -- 将字符串转换为数字
  local value = tonumber(line)
  -- 如果我们将值考虑在内
  if value ~= 0.0 then
    ctr = ctr + 1
    valtotal = valtotal + value
    -- 更新 min 和 max 值
    min = value < min and value or min
    max = value > max and value or max
    -- 更新计数器
    counts[value] = counts[value] and counts[value] + 1 or 1
  else
    -- 计算被忽略的值
    numIgnored = numIgnored + 1
  end
end

print("----表打印输出-----")

for k, v in pairs(counts) do
    print(k,v)
end

print("---------------------------")
print("记录的最低值 = " ..min)
print("记录的最高值 = " ..max)
print("记录的平均值 = " ..round2(valtotal / ctr, 1))
print("记录的值的数量 = " ..ctr)
print("---------------------------")

local max_val, key1 = -math.huge
for k, v in pairs(counts) do
    if v > max_val then
        max_val, key1 = v, k
    end
end

local min_val, key2 = math.huge
for k1, v1 in pairs(counts) do
    if v1 < min_val or v1 == min_val then
        min_val, key2 = v1, k1
    end
end

local min_qty, max_qty = 0, 0
local min_str, max_str = "", ""
for k2, v2 in pairs(counts) do
    if v2 == min_val then
        min_qty = min_qty + 1
        min_str = min_str .. " " .. k2
    elseif v2 == max_val then
        max_qty = max_qty + 1
        max_str = max_str .. " " .. k2
    end
end

if min_qty == 1 then
    print("最少记录的值为 = " ..key2.. ",记录了 "..min_val.." 次")
else
    print("最少记录的值有 = " ..min_str.. ",分别记录了 "..min_val.." 次")
end
if max_qty == 1 then
    print("最多记录的值为 = " ..key1.. ",记录了 "..max_val.." 次")
else
    print("最多记录的值有 = " ..max_str.. ",分别记录了 "..max_val.." 次")
end
print("---------------------------")
2021-10-19 09:15:43