I’ve been writing values to a text/csv file, but as certain information has now changed, I need to update the file to reflect the new values/calculations.
The text/csv file is a report on energy used, sample below, and it’s the KwH Unit Cost and Cost (which is calculated from the KWH Used * KwH Unit Cost) that both need updating.
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,
I’m able to parse the csv/text file to a table, but I’m unable to work out how to extract update the unit cost from 0.3506 to 0.3877 and recalculate the Cost based on that new rate.
My Lua code is below, which shows the cost values. That’s as far as I’m able to go ..
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)
if not indent then indent = 0 end
for k, v in pairs(tbl) do
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
table.insert(row, word)
end
table.insert(rows, row)
end
return rows
end
local CSV_Table = parseCsv(CSV)
print(tprint(CSV_Table))
for k,v in pairs(CSV_Table) do
--print (k,v)
for k1,v1 in pairs(v) do
--print (k1,v1)
if k1 == 8 then
print(v1)
end
end
end
Any/all help greatly appreciated..
I managed to get my code to work, here’s what I used in the end..