Lua - 从不一致的 CSV 文件中检索所有倒数第二个值

Lua - Retrieve all second from last values from an inconsistent CSV file

我有一个 csv 文件 (DailyEnergyCost.txt),其中包含许多不同的行条目变体,但它只是我要检索的最后一个值的第一个和第二个。所以我可以将它们绘制在图表上

2022-03-14 23:59:00, 23.51, 6.21, 0.264,
2022-03-15 23:59:00, 21.74, 5.74, 0.264,
2022-03-16 23:59:00, 18.87, 4.98, 0.264,
2022-03-23 09:00:37, 145.79, 38.49, 0.264,
2022-03-23 09:06:44, 3210.2370, 3210.5250, 0.29, 0.08, 0.264, 
2022-03-23 23:59:00, 3210.5250, 3224.2470, 13.72, 3.62, 0.264, 
2022-03-29 23:59:00, 1648508340, 1648594740, 3322.4630, 3343.3360, 20.87, 5.51, 0.264, 
2022-03-30 23:59:00, 1648594740, 1648681140, 3343.3360, 3365.2770, 21.94, 5.79, 0.264, 
2022-03-31 23:59:00, 1648681140, 1648767540, 3365.2770, 3395.7930, 30.52, 8.06, 0.264,

现在我已经尝试弄清楚获取最后一个条目的逻辑,在数组中使用上面 csv 中的一行..见下文..但这只适用于一点。

local arr = {3210.5250, 3224.2470, 13.72, 3.62, 0.264}
for i,v in pairs(arr) do
    last = #arr - 1
end
print(last)

我也知道还有 lines 选项,允许我逐行浏览文件..

local file = io.open("www/DailyEnergyCost.txt")
local lines = file:lines()
for line in lines do
    print("\t" .. line)
end

但是,有人可以分享您如何通过 csv 文件逐行工作,该文件没有一致的条目以提取最后一个条目吗?

使用上面的数据源示例作为指导,生成的 Lua 脚本应该 return 以下内容。 (第一项,倒数第二项)。

2022-03-14 23:59:00, 6.21
2022-03-15 23:59:00, 5.74
2022-03-16 23:59:00, 4.98
2022-03-23 09:00:37, 38.49
2022-03-23 09:06:44, 0.08
2022-03-23 23:59:00, 3.62
2022-03-29 23:59:00, 5.51
2022-03-30 23:59:00, 5.79
2022-03-31 23:59:00, 8.06

读取整个文件并使用模式取值:

local fp = io.open("www/DailyEnergyCost.txt","rb")
local text = fp:read('*a')
print(text)
local time, value
for line in text:gmatch("[^%c]+") do
  time = line:match("^(.-),")
  value = line:match(".+,%s+(.-),.-,") or ""
  print(time .. ", " .. value)
end

解释:

"^(.-)," :

^ - 从开始

(.-), - 匹配第一个符号 , 之前的所有字符(惰性量词)

".+,%s+(.-),.-," :

.+, - 从结尾开始第 3 个符号 , 之前的所有字符,(贪婪量词)

%s+ - 最大空间

(.-), - 匹配我们的字符(在,之前最少)

.-, - 这不是我们的角色 - 这里不见了。

这是我最后使用的代码,非常感谢@Mike V 在这方面的帮助..

local fh,err = io.open("www/DailyEnergyCost.txt")
    if err then print("file not found"); return; end

-- Open a file for write
local fho,err = io.open("/mnt/nas/DailyEnergyCostExtract.txt","wb")

local time, value

while true do
    line = fh:read()
        if line == nil then break end
        if line:gmatch("[^%c]+") then
            time = line:match("^(.-),")
            value = line:match(".+,%s+(.-),.-,") or ""
            -- print(time .. ", " .. value)
            fho:write(time .. ", " .. value)
            fho:write("\n")
        end
    end

fh:close()
fho:close()

-- Let’s just check the file.

local file = io.open("/mnt/nas/DailyEnergyCostExtract.txt")
local lines = file:lines()
for line in lines do
    print("\t" .. line)
end