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

如何用Lua读取CSV文件更新单位电价并重新计算电费?

解决Lua中CSV能耗数据更新与计算问题

要完成更新KwH Unit Cost并重新计算Cost Spent的需求,需要在现有解析代码基础上添加数值转换、数据更新与计算逻辑,以下是修改后的完整实现:

local CSV = [[Date Time Run,  Start Epoc,  End Epoc, KwH Start, KwH End, KwH Used, KwH Unit Cost, Cost Spent
2022-12-11 13:12:53, 1670763866, 1670764373, 7841.1690, 7841.2920, 0.12, 0.3506, 0.04, 
2022-12-11 23:59:00, 1670764373, 1670803140, 7841.2920, 7853.5480, 12.26, 0.3506, 4.3, 
2022-12-12 23:59:00, 1670803140, 1670889540, 7853.5480, 7887.0740, 33.53, 0.3506, 11.76, 
2022-12-13 23:59:00, 1670889540, 1670975940, 7887.0740, 7917.4370, 30.36, 0.3506, 10.64, ]]

local function tprint(tbl, indent)
  indent = indent or 0
  for k, v in pairs(tbl) do
    local formatting = string.rep("  ", indent) .. k .. ": "
    if type(v) == "table" then
      print(formatting)
      tprint(v, indent + 1)
    elseif type(v) == 'boolean' then
      print(formatting .. tostring(v))
    else
      print(formatting .. v)
    end
  end
end

local linePattern = "[^\r\n]+"
local csWordPattern = "[^,]+"

local function parseCsv(csv)
    local rows = {}
    for line in string.gmatch(csv, linePattern) do
        local row = {}
        for word in string.gmatch(line, csWordPattern) do
            -- 去除字段前后空格,避免干扰数值转换
            local trimmed = word:match("^%s*(.-)%s*$")
            table.insert(row, trimmed)
        end
        table.insert(rows, row)
    end
    return rows
end

-- 处理数据更新与计算的函数
local function updateCsvData(rows, newUnitCost)
    -- 跳过表头(第一行)
    for i = 2, #rows do
        local row = rows[i]
        -- 将KwH Used转为数值,计算新的Cost Spent
        local kwhUsed = tonumber(row[6])
        if kwhUsed then
            -- 更新KwH Unit Cost
            row[7] = tostring(newUnitCost)
            -- 计算并保留两位小数,和原数据格式一致
            local newCost = kwhUsed * newUnitCost
            row[8] = string.format("%.2f", newCost)
        end
    end
end

-- 将更新后的表转回CSV字符串的函数
local function tableToCsv(rows)
    local csvLines = {}
    for _, row in ipairs(rows) do
        table.insert(csvLines, table.concat(row, ", "))
    end
    return table.concat(csvLines, "\n")
end

-- 执行流程
local CSV_Table = parseCsv(CSV)
-- 更新数据,传入新单价0.3877
updateCsvData(CSV_Table, 0.3877)

-- 打印更新后的表
print("更新后的CSV表数据:")
tprint(CSV_Table)

-- 生成更新后的CSV字符串并打印
local updatedCsv = tableToCsv(CSV_Table)
print("\n更新后的CSV内容:")
print(updatedCsv)

关键修改说明:

  • 字段清洗:解析CSV时去除每个字段前后的空格,避免后续数值转换出错
  • 数值转换:将KwH Used字段转为数值类型,才能进行乘法计算
  • 批量更新:从第二行(数据行)开始遍历,替换KwH Unit Cost为新单价,并计算新的Cost Spent
  • 格式统一:用string.format("%.2f", newCost)保留两位小数,和原数据的格式对齐
  • CSV转回:新增tableToCsv函数,将更新后的表重新转为CSV格式字符串,方便保存或输出

内容的提问来源于stack exchange,提问作者nodecentral

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:00:53