如何用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
相关产品推荐
相关产品推荐

