Lua -读取csv文件,更新一些值(计算)并写入新文件

iqjalb3h  于 2023-01-06  发布在  其他
关注(0)|答案(1)|浏览(284)

我一直在将值写入文本/csv文件,但由于某些信息现在已更改,我需要更新该文件以反映新的值/计算。
text/csv文件是一个关于能耗的报告,示例如下,KwH Unit CostCost(根据KWH Used * KwH Unit Cost计算)都需要更新。

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,

我可以将csv/text文件解析为一个表,但我无法计算出如何将单位成本从0.3506提取更新为0.3877,并根据新的费率重新计算Cost
下面是我的Lua代码,它显示了成本值。这是我所能做到的。

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

任何/所有的帮助都非常感谢。

nwo49xxi

nwo49xxi1#

我设法让我的代码工作,这是我在最后使用..

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 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 data = parseCsv(CSV)
local newarr = {}
for i,v in pairs(data) do
    local rate = 0.386
    local usage = tonumber(v[6])
    if type(usage ) == "number" then
        local cost = (usage * rate)
        table.insert(newarr, {v[1], v[2], v[3], v[4], v[5], v[5], v[6], rate, cost})
    else
        table.insert(newarr, {v[1], v[2], v[3], v[4], v[5], v[5], v[6], v[7], v[8]})
    end
end

for k, v in pairs(newarr) do
    print(table.concat(v,", ")) 
end

相关问题