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



我有一个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脚本应该返回以下内容。(第一项,倒数第二项(。

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

这是我最后使用的代码,非常感谢@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

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

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+-最大空间

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

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

相关内容

  • 没有找到相关文章